學習驗證碼快一個星期了,終於把樣本集切出來了,現在問題是如何切粘連字符,現在將自己的學習過程記錄下來;
第一部分:
下面很大一部分轉自http://drops.wooyun.org/tips/141;感謝原作者。
我們知道,對於不黏連的字符,直接用掃描線分割法就可以,就是看哪一個豎條上沒有文字像素,則這個豎條就是兩個字符間的空白部分;
當然,對於不黏連的字符,CFS算法效果也很好,它主要是利用連通域進行划分;
還有CFS4D的方法,他只掃描上下左右4個像素來判斷是否為種子的連通域;
而CFS則是將他周圍的8個像素來判斷的。
對於每次字符大小和數量都一樣的驗證碼還可以用平均分割法,也就是直接先把中間的文字部分整體切出來,然后按寬度平均分成幾份,這種方式對字符粘連比較多用其他方式不好分割的驗證碼很有用
對於有少許粘連但是只是在字符邊角的地方重疊幾個像素的驗證碼,可以用垂直像素直方圖的統計方法分割。就是對每一個豎條,統計該豎條上出現的像素數(當然,前提要是二值化的圖)
還有滴水算法;
http://drops.wooyun.org/tips/141
上半部分是垂直像素直方圖的一種直觀展示,假如圖片寬度為100像素,則把圖片切割為100個1像素的豎線,下面的紅色部分為當前x坐標上所有黑色像素的總和。這么一來可以很容易的通過直方圖的波峰波谷把4個字母分割開。圖片的下半部分是掃描線分隔法,因為干擾線和字符旋轉的存在,只有M和5直接才出現了連續的空白部分。
除了垂直像素直方圖,還可以從不同的角度進行斜線方向的像素數投影,這種方式對於每次全體字符都隨機向一個角度旋轉的驗證碼效果很好。
另外對於彩色的驗證碼,還可以用顏色分割
作為驗證碼識別里的難點,分割字符還有很多種算法,包括筆畫分析曲線角度分析等等,不過即便如此,對粘連的比較厲害的字符還是很難成功的
還原隨機旋轉的字符一般采用的是旋轉卡殼算法:
此算法非常簡單,對一張圖片左右各旋轉30度的范圍,每次1度,旋轉后用掃描線法判斷字符的寬度,對於標准的長方形字體,在完全垂直的時候肯定是寬度最窄的。嗯?納尼?上面的圖是中間的最窄?好像的確是這樣,不過只要每次旋轉后的結果都一樣,對於識別率不會有影響。
扭曲還原的算法比較蛋疼,效果也不怎么樣(其實我不會),不過如果識別算法好的話,對扭曲的字符只要人能認出來,識別率也可以達到接近人類的水准。
第二部分:
銳化 & 平滑: 圖像平滑往往使圖像中的邊界、輪廓變得模糊,為了減少這類不利效果的影響,這就需要利用圖像銳化技術,使圖像的邊緣變的清晰。圖像銳化處理的目的是為了使圖像的邊緣、輪廓線以及圖像的細節變的清晰。
題外話:
今天編碼的時候有很多細節問題,處理不好,一上手就開始碼字,編完一編譯才發現很多圖片序號問題不對,然后各種修改,原本清晰地代碼被改的面目全非,哎,豈是一個心累能表達的,教訓:以后編碼之前要好好思考一下,細節的處理,最好可以寫個大概的框架出來,這樣避免很多細節問題惡化,甚至影響整體思路。