本文乃Siliphen原創,轉載請註明出處:http://blog.csdn.net/stevenkylelee/
我的驗證碼識別實踐一共有3篇文章。
上一篇《驗證碼識別實踐2》:http://blog.csdn.net/stevenkylelee/article/details/8270069
這是我第三篇驗證碼識別實踐的總結文章。
花了幾天時間專門做了這個驗證碼的識別
驗證碼地址:
http://pay.m3guo.com/include/KeyCode.aspx
截圖:
這個碼看起來蠻簡單的,人一看就知道了
有人說,如果這個碼難識別,
那麼一定是難在噪點干擾處理上吧
不盡然,至少對我來說,要處理的問題還有很多
對於做過驗證碼識別的人來說,
噪點是一方面,還有干擾線。
去噪點有比較多的方法。比如:提取連通分量。
把小於某個指定面積的相連的一塊點集合認爲是噪點,
塗成背景色。我目前用的就是這種方法
也可以用一個叫:中值濾波 的操作來去除
中值濾波是什麼?我初學者不太懂,只知道這個名詞
懂的人,歡迎找我交流討論。:)
仔細觀察一下這種驗證碼。它的特點是:
隨機噪點,隨機噪點顏色,隨機字符位置,
隨機字符大小,隨機字符顏色,隨機干擾線
雖然隨機成分比較多。但總體上來說。
隨機的範圍也不大。比如:隨機字符位置
4個字符。每個字符的位置都不會隨機得很離譜
所以,可以很輕鬆地測量到它的隨機範圍。
爲每個字符定義一個ROI,
這個ROI就是字符怎麼隨機都不會“隨”出的範圍。
我原先是先簡單二值化,然後,爲每個字符定義ROI
用這個ROI去取特徵,當然,噪點也納入進去了。
我原以爲這樣搞一下,應該就可以識別了。
誰知道,訓練了幾個小時樣本。識別率還不到10%。
(每次都有1-3個字符是對的,而4個同時對很少)
後來感覺,可能是噪點很大程度地混淆了特徵空間,
所以,怎麼訓練都不會超過15%的識別率
再改進,用連通分量法,去掉噪點,再訓練。
經過了幾個小時訓練+小修改算法,
識別率最終達到了30%
然後,怎麼都上不去了。
30%的識別率效果有點差。
沒有辦法,得繼續想辦法處理。
在上面的操作中,我一直沒有處理干擾線。
所以,在干擾線存在下,識別率只會在20% - 40%之間。
再仔細觀察思考,發現爲了使人類能識別出來,
驗證碼生成的作者,在字符和干擾線上用了不同的顏色。
是不是可以在顏色上做文章呢。。。
想好實現算法後,馬上動手開始嘗試去除干擾線。
我的方法是:先爲每個字符的ROI區域上進行顏色分類
注意,這一步,不是拿二值化後的圖像進行操作了
而是需要拿原始彩色圖像。
算法的目標是:在一個ROI內,統計出裏面的色塊種類數
比如:有黃色,紅色,藍色等,每個顏色分成一個種類
如果,黃色和紅色之間有過渡色的話,
就把這2個顏色種類合併成一個種類。
最後把顏色種類面積最大的輪廓認爲是字符輪廓
這個算法我實現得比較複雜,有差不多300多行
幾個小時寫了又調試,最終結果如下:
上面一行是原圖,下面一行是處理後的圖
上圖中下面一行的圖像是調試圖像。
藍色方框是最小包圍框。不用管它
可以看到“橫着來的”2條幹擾線不見了。哈哈
再經過幾個小時訓練樣本,識別率達到了80%以上!
OK,基本上大功告成了
數數純用C#寫的代碼。
這個驗證碼代碼1500行。
有3層類繼承層次。(第二層是上一篇文章用的識別器類)
真驚人。
其實,我這個的實現算法,還有很多不足。
基本上理論和第一篇文章說的差不多。
什麼N*M特徵法。我個人感覺這個特徵法不是很好用
比如:在一個字符被幹擾線粘合拉長的時候,
整個包圍方塊就變形了
而中心矩是基於求出質心來計算的,
歸一化鉅又基於除以面積計算,
所以,可能矩是描述輪廓更好的辦法
下次有機會試試矩。
——————————————————————
最後說下除了技術的題外話。
這個驗證碼我沒事絕對不會去研究的,因爲很耗費時間。
實驗訓練樣本又是個體力活。
做這個碼純粹是一個這2天來加我的CSDN網友。
他一開始就提出做這個碼並且談價格。
有回報,我當然有動力去嘗試了。
第一次做出來30%識別率,他不要,說要到80%以上
最後,做到了80%以上。完全符合了他的要求
他老哥子說一句:“算了,這個不做先了。
我還有事情,Bye,下次我們再合作。”
結果就刪掉了我的Q,跑了。
我算是白忙一場。不過,安慰自己
至少我還可以寫出這篇總結文章,
長了點經驗(不光光是在技術上)
看這個驗證碼所屬的網站的主頁:http://pay.m3guo.com/
大概是什麼“電魂在線充值系統”
做這個網站的驗證碼識別有什麼經濟效益?