驗證碼識別實踐3:自己動手C#實現,顏色差異法去除干擾線

本文乃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/

大概是什麼“電魂在線充值系統”

做這個網站的驗證碼識別有什麼經濟效益?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章