動網的驗證碼
基於矢量,摻雜矢量的角度值隨機偏移和長度值隨機偏移,默認的比例爲角度:10度和長度:10%
特點:
- 圖片大小固定,默認80*20。數字個數固定,默認4,每個數字大小固定,默認20*20。
- 矢量隨機角度值(默認隨機量10°)和隨機長度值(默認隨機量10%比率)。最終圖片根據隨機後的點陣自動縮放大小調整。
- 有隨機噪點。默認噪點比率:背景20%,數字10%。
- 噪點特徵:Brightness > 50
- 數字可隨機顏色。數字的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驗證碼
特點:驗證碼位置隨機,沒有旋轉。有噪點和干擾線,隨機顏色的邊框。字符顏色採用漸變色,斜體,大小無變化。相鄰字符會發生粘連的情況。
識別思路:
- 去邊框
- 去幹擾線和噪點。
- 仍然採用類似於上面的分析方法。去除S/B中某個域。即可以比較完美的去除所有的噪點和干擾線
- 由於干擾都出現在背景中,處理完畢後的圖像不會發生大的退化。這是比較弱的一個方面
- 識別
- 從左到右豎向掃描,查找第一個字符的位置,獲取一個寬度內的像素點。
- 與數據庫字符樣本進行每個像素的比對或者特徵點比對。由於字符沒有變形和旋轉,所以比對可以採用 == 進行。並統計不匹配點所佔該樣本點的個數的比率。最小的即爲識別結果
- 根據樣本數據庫中記錄的匹配樣本的寬度,去除該寬度範圍(需要考慮到斜體字符的傾斜角度)內的點,從當前點往後進行下一個字符的掃描。
- 分析
- 優點:可以消除粘連字符的影響
- 缺點:前面字符的識別結果會影響到後面的
- 由於沒有寫程序驗證,猜想速度可能會比較慢
- 此種方法對字符本身無變形,位置隨機的會有比較好的效果
其他驗證碼
QQMail / Gmail / Hotmail (怎麼都是mail ^_^)的大變形驗證碼不要找我 ~_~
QQ Zone的沒有仔細看過,可以一試
後記
現只對動網驗證碼寫出了識別程序。辛苦所得,暫不公佈源碼 (*^__^*)