C#利用deskew算法实现图像文本倾斜校正
作者:FL1623863129
这篇文章主要为大家详细介绍了C#如何利用deskew算法实现图像文本倾斜校正,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
算法介绍
让我们开始讨论Deskeweing算法的一般概念。我们的主要目标是将旋转的图像分成文本块,并确定它们的角度。为了让您详细了解我将使用的方法:
照常-将图像转换为灰度。
应用轻微的模糊以减少图像中的噪点。
现在,我们的目标是找到带有文本的区域,即图像的文本块。为了使文本块检测更容易,我们将反转并最大化图像的颜色,这将通过阈值化来实现。因此,现在文本变为白色(恰好为255,255,255白色),而背景为黑色(同样为0,0,0黑色)。
要查找文本块,我们需要合并该块的所有打印字符。我们通过膨胀(扩展白色像素)来实现。在X轴上使用较大的内核可以消除单词之间的所有空间,而在Y轴上使用较小的内核可以将彼此之间的一个块的行混合在一起,但保持文本块之间的较大间隔不变。
现在,用最小面积矩形包围轮廓的简单轮廓检测将形成我们需要的所有文本块。
确定倾斜角度的方法有很多种,但我们将坚持简单的方法-使用最大的文本块并使用其角度。
效果展示
实现部分代码
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace FIRC { public partial class Form1 : Form { Bitmap src = null; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "图文件(*.*)|*.jpg;*.png;*.jpeg;*.bmp"; openFileDialog.RestoreDirectory = true; openFileDialog.Multiselect = false; if (openFileDialog.ShowDialog() == DialogResult.OK) { src = new Bitmap(openFileDialog.FileName); pictureBox1.Image = src; } } private void button2_Click(object sender, EventArgs e) { if(pictureBox1.Image==null) { return; } Stopwatch sw = new Stopwatch(); sw.Start(); var gd = new gmseDeskew(src); var angle = gd.GetSkewAngle(); var resultImage = gmseDeskew.RotateImage(src, angle); sw.Stop(); this.Text = "耗时" + sw.Elapsed.TotalSeconds + "秒"; pictureBox2.Image = resultImage; } private void Form1_Load(object sender, EventArgs e) { } private void btn_video_Click(object sender, EventArgs e) { } } }
到此这篇关于C#利用deskew算法实现图像文本倾斜校正的文章就介绍到这了,更多相关C#图像文本校正内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!