C#利用deskew算法實現(xiàn)圖像文本傾斜校正
算法介紹
讓我們開始討論Deskeweing算法的一般概念。我們的主要目標(biāo)是將旋轉(zhuǎn)的圖像分成文本塊,并確定它們的角度。為了讓您詳細(xì)了解我將使用的方法:
照常-將圖像轉(zhuǎn)換為灰度。
應(yīng)用輕微的模糊以減少圖像中的噪點。
現(xiàn)在,我們的目標(biāo)是找到帶有文本的區(qū)域,即圖像的文本塊。為了使文本塊檢測更容易,我們將反轉(zhuǎn)并最大化圖像的顏色,這將通過閾值化來實現(xiàn)。因此,現(xiàn)在文本變?yōu)榘咨ㄇ『脼?55,255,255白色),而背景為黑色(同樣為0,0,0黑色)。
要查找文本塊,我們需要合并該塊的所有打印字符。我們通過膨脹(擴(kuò)展白色像素)來實現(xiàn)。在X軸上使用較大的內(nèi)核可以消除單詞之間的所有空間,而在Y軸上使用較小的內(nèi)核可以將彼此之間的一個塊的行混合在一起,但保持文本塊之間的較大間隔不變。
現(xiàn)在,用最小面積矩形包圍輪廓的簡單輪廓檢測將形成我們需要的所有文本塊。
確定傾斜角度的方法有很多種,但我們將堅持簡單的方法-使用最大的文本塊并使用其角度。
效果展示
實現(xiàn)部分代碼
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) { } } }
到此這篇關(guān)于C#利用deskew算法實現(xiàn)圖像文本傾斜校正的文章就介紹到這了,更多相關(guān)C#圖像文本校正內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#實現(xiàn)對數(shù)組進(jìn)行隨機(jī)排序類實例
這篇文章主要介紹了C#實現(xiàn)對數(shù)組進(jìn)行隨機(jī)排序類,實例分析了C#數(shù)組與隨機(jī)數(shù)操作技巧,非常具有實用價值,需要的朋友可以參考下2015-03-03C#使用System.Threading.Timer實現(xiàn)計時器的示例詳解
以往一般都是用 System.Timers.Timer 來做計時器,其實 System.Threading.Timer 也可以實現(xiàn)計時器功能,下面就跟隨小編一起來學(xué)習(xí)一下如何使用System.Threading.Timer實現(xiàn)計時器功能吧2024-01-01