識別動網驗證碼和CSDN驗證碼的思路

動網的驗證碼

基於矢量,摻雜矢量的角度值隨機偏移和長度值隨機偏移,默認的比例爲角度:10度和長度:10%

特點:

  1. 圖片大小固定,默認80*20。數字個數固定,默認4,每個數字大小固定,默認20*20。
  2. 矢量隨機角度值(默認隨機量10°)和隨機長度值(默認隨機量10%比率)。最終圖片根據隨機後的點陣自動縮放大小調整。
  3. 有隨機噪點。默認噪點比率:背景20%,數字10%。
  4. 噪點特徵:Brightness > 50
  5. 數字可隨機顏色。數字的Brightness均爲50

識別思路如下:

1.去噪點

濾去所有Brightness不是50的點。這樣會使數字上的噪點也被除去,造成數字失真。由於實際上採用的識別比對是基於統計的,所以關係不大。但也可以使用帶權的中值濾波進行一定程度的修復。權值: 當前點 : 臨接點 : 斜點 = 4 : 2 : 1 = 0.25 : 0.125 : 0.0625 。 將Brightness>50的點填充爲白點,=50的點填充爲黑點,存到數組中也可以只用bool或者 0/1表示

ps: 取 Brightness 的方法,請搜索 HSB/ HSV 的說明。.net 2.0中 Color.GetBrightness方法可以直接取到,結果值域 [0.0,1.0]

2.分塊統計

將20 * 20的數字及其背景分爲 5 * 5 個小塊,每塊包含16個像素點,存放在一個25個元素的數組。由於前面已經做過去噪,所以數組中可以僅僅存儲該小塊內包含的數字點的個數。

3.比對

將與數據庫中存儲的0~9十個數字的對應小塊的點數值進行方差計算。與0~9中分塊點數的方差最小的數字作爲識別結果返回。

4. 數據庫說明

數據庫中的數據可通過學習統計而來。大約對每個數字統計100~200個左右的樣本即可。

5. 分析

  • 優點:識別相當精確。目前的驗證程序對於單個字母已經可以達到90%以上的準確率。對除2/7 、 6/8/9 數字對以外的數字可以達到 95%以上準確率
  • 缺點:中值濾波對數字輪廓有一定變形作用,濾波之後會可能導致變形過大的數字識別錯誤,但也可能會加強某些特徵。比如2/7、6/8、8/9
  • 性能未進行測試,目前使用C#2.0,在粗糙的優化後,識別每個驗證碼的時間不超過1秒,4數字的識別率未測試。
  • 可能可以提高準確率的方法:
    • 記錄方差的同時,記錄學習數據的方差的平均值。識別比對時尋找方差與期望差值最小的進行比較
    • 合理使用中值濾波和旋轉。把去方差最小的前三個識別數據,再進行旋轉變換和中值濾波,使用原比對算法進行識別,預計可以提高圖片識別的準確率到95%
    • 對於固定圖片大小的,每次形狀相同或者類似的驗證碼,均可以使用這個思路解決

 6.測試結果

未加中值濾波操作

對程序進行了100次識別測試,每次四個字符,正確89次,失敗9~11次,其中錯誤12個字符,有兩個1/2完全無法分辨,所以不能判斷是正確還是錯誤,還有兩個識別錯誤的,肉眼也同樣很難分辨。

字符識別準確率在97%左右。個別字符,如3,4,7,0,沒有出現錯誤,可以認爲99%以上準確率。

可以認爲總體識別準確率在90%左右。連續兩次識別錯誤的概率在1%左右(測試時有兩次連續兩次識別錯誤 -_-!! )

錯誤字符如下:

識別錯誤統計

原字符

識別字符

出現次數

8 6 3 9 4 1 6 5 2 6 2 1 2 3 1 8 3 1 1 2 2 ( 不確定原字符爲1還是2) 5 3 1 合計   10~12

測試識別消耗時間如下:

1 載入識別庫     操作耗時:  31 ms ,     312500 ticks
2 網絡抓取      操作耗時: 203 ms ,    2031250 ticks
3 保存        操作耗時:  31 ms ,     312500 ticks
4 識別        操作耗時:  31 ms ,     312500 ticks
0 全部操作      操作耗時: 296 ms ,    2968750 ticks

若只進行識別操作僅需100ms左右。

附本人測試機配置如下:

AMD Opteron 3000+ , 512M Ram (外頻未知), 80 G ATA 133 HD , 網絡爲 ADSL 2M


 

CSDN驗證碼

特點:驗證碼位置隨機,沒有旋轉。有噪點和干擾線,隨機顏色的邊框。字符顏色採用漸變色,斜體,大小無變化。相鄰字符會發生粘連的情況。

識別思路:

  1. 去邊框
  2. 去幹擾線和噪點。
    • 仍然採用類似於上面的分析方法。去除S/B中某個域。即可以比較完美的去除所有的噪點和干擾線
    • 由於干擾都出現在背景中,處理完畢後的圖像不會發生大的退化。這是比較弱的一個方面
  3. 識別
    1. 從左到右豎向掃描,查找第一個字符的位置,獲取一個寬度內的像素點。
    2. 與數據庫字符樣本進行每個像素的比對或者特徵點比對。由於字符沒有變形和旋轉,所以比對可以採用 == 進行。並統計不匹配點所佔該樣本點的個數的比率。最小的即爲識別結果
    3. 根據樣本數據庫中記錄的匹配樣本的寬度,去除該寬度範圍(需要考慮到斜體字符的傾斜角度)內的點,從當前點往後進行下一個字符的掃描。
  4. 分析
    • 優點:可以消除粘連字符的影響
    • 缺點:前面字符的識別結果會影響到後面的
    • 由於沒有寫程序驗證,猜想速度可能會比較慢
    • 此種方法對字符本身無變形,位置隨機的會有比較好的效果

 


 

其他驗證碼

QQMail / Gmail / Hotmail (怎麼都是mail ^_^)的大變形驗證碼不要找我 ~_~

QQ Zone的沒有仔細看過,可以一試

 


 

後記

現只對動網驗證碼寫出了識別程序。辛苦所得,暫不公佈源碼 (*^__^*)

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