简单的图像去噪的实现和验证码识别
StevenKyleLee原創:http://blog.csdn.net/stevenkylelee/article/details/6973471
轉載請注明
最近接到一個任務:去除圖像中的噪點。
圖片是從掃描儀掃描進來的,色彩只有黑白二值。因為是從書本上掃描,而書本上的紙張有背景色,
所以導致掃描的圖片會出現一大片離散的噪點。為什么要去除噪點呢?因為噪點會干擾OCR程序對文字圖片的識別。
一張有噪點的、掃描進來的黑白原圖如下:
如何去除噪點呢?
觀察了好一段時間,發現,凡是一個漢字的都是一大片相連的黑色像素。而噪點都是較小塊的黑色像素。
是否可以通過判斷黑色像素塊的大小(相連的黑色像素數)來確定是一個漢字,還是一塊噪點呢?
感覺這個方法應該可行,實現起來不算太難,也沒涉及多少圖像處理的算法和知識
于是乎,就試著動手吧。。。
先梳理一下思路:把整個位圖(可看成是一個二維數組)認為是一個圖(數據結構中的圖的概念),
相鄰的同色像素點之間有通路,用深度或廣度優先搜索,取得所有的連通分量。
(類似水滴或染色算法,染色就是把曾經走過的路徑著色標記起來,而我用hash表記錄曾經走過的軌跡。)
如果連通分量的大小低于某個值,就認為它是一個離散的噪點,然后用背景色抹掉這個噪點。
當然,這樣做是建立在“組成中文字的一個連通分量很大,而離散噪點通常很小”的假設上。
如何把一個位圖看成是一個圖呢?對于相鄰的同色像素點,我想了2個規則。如下圖:
目前來說我選擇規則1,既是上下左右可能有通路,而斜邊不存在通路
一個下午,程序就寫出來了。效果還可以。上面掃描原圖的大部分噪點都能去除了。
但對于一些字的邊緣的毛刺 和 一些大塊的只有小部分相連的噪點 還不能去除。
想了下,又多加了2個函數:我稱之為:水平、垂直切割吧。
這2個函數的作用,就是從水平或者垂直方向嘗試“切斷”線段,有一個切割參數,表示可以切斷的線段大小。
比如:切割大小為1,就是一條只有1像素粗細的垂直線段會被水平切割函數“切斷”,
其實“切斷”就是把被能切斷的像素設置為背景色。
在執行判斷連通分量大小去塊的操作之前,先執行水平、垂直切割,
這樣一些與字只有一個像素相連的噪點小塊,就會被“切斷”了。從而被下一步的判斷連通分量的操作給去掉
上面掃描原圖經過我的程序處理后的效果如下:
由于代碼也不太短,所以,這里我就只分享下自己的思路了,
我的程序的源代碼和一些樣本圖下載地址如下,還請不吝高手多多指教啊!(代碼中也寫了一個自己的腐蝕算法):
http://download.csdn.net/detail/stevenkylelee/3798884
我個人覺得在帖子中帖代碼,還不如把整個源代碼工程上傳。
1.節省版面。2.方便別人調試、查看。
轉載于:https://www.cnblogs.com/sung/archive/2013/01/20/2868222.html
總結
以上是生活随笔為你收集整理的简单的图像去噪的实现和验证码识别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 正确处理 Azure OnStop 事件
- 下一篇: 很炫的shell theme