引言
演算法分析
驗證碼識別原理及**演示
for (int i = 0; i < bmpobj.height; i++)//遍歷高度}}
灰度化之後,畫素的rgb三色都是相同的值了,亮度從0~255(hxff)。但用於識別程式,灰度值並不能很好的區分背景色和前景色,尤其是對於漸進的背景來說,所以我們還要將影象進一步處理,就是將灰度2值化,類似的演算法還有分水嶺演算法等。因為本文中的驗證碼相對簡單,故直接使用2值化轉換,尋找有效區並轉為單色黑白圖。
圖2此時影象分割已結束,pics 的長度應該是4,並且每乙個pics就是乙個驗證碼的點陣圖,經過錯誤處理,修邊,和去除無用背景空白,修正完的點陣圖為數字0。
得到有效圖形後,由外面傳入該圖形,設定灰度背景分界值為「dggrayvalue」,有效字元數為charscount,程式編寫如下:
至此,pics影象組中就是有效的點陣圖了。下面我們把pics中的圖形轉換為代表點陣的字串,返回灰度的點陣描述字串,1表示灰點,0表示背景。設定灰度圖為singlepic,背前景灰色界限為dggrayvalue。
此時,code中的字串就代表字元0在工行wap銀行上影象驗證碼的值了;以此類推,我們可以得到乙個完整的,代表影象0~9的陣列,字元表的順序為0~9,a~z,a~z。
現在,點陣陣列已經取得了,接下來我們看看如何把乙個識別出來吧!已知如下的點陣表:
開始處理比較操作:
至此,sbresult中的4個數字就是影象上的4個數字了。
結論
驗證碼識別肯定不只是這麼簡單,但現在還是有很多**都在用這種未經任何變換的驗證碼,所以我們的網路安全還任重而道遠。
上面的驗證碼識別是乙個最基本的演算法,但是很多擴充套件演算法都可以基於上面的思路進行擴充。例如有些驗證碼進行了旋轉輸出,那麼上面的程式可以在校對的時候,進行360度旋轉,旋轉後的影象再取得序列,再和影象序列比較,直至得到最符合的。有些驗證碼新增了邊框,此時我們可以先去掉邊框再進行切割匹配。
通過上面的演算法可以得出,我們今後在設計驗證碼的時候,應該注意如下因素:
1)在噪音等型別的使用上,盡力讓字元和用來混淆的前景和背景不容易區分,盡力讓噪音長得和字母一樣。
2)特別好的驗證碼的設計,要盡力發揮人類擅長而ai演算法不擅長的。比如粘連字元的分割和手寫體(通過印刷體做特別的變形也可以),而不要一味的去加一些看起來比較複雜的噪音或者其他的花哨東西。
3)從專業的機器視覺的角度來說,網路安全驗證碼的設計,一定要讓破解者在識別階段,反覆在低階視覺和高階視覺之間多反覆幾次才能識別出來,這樣可以大大降低破解難度和破解的準確率。
C 下的驗證碼識別
轉 引言 演算法分析 驗證碼識別原理及 演示 c sharp view plain copy print?灰度化之後,畫素的rgb三色都是相同的值了,亮度從0 255 hxff 但用於識別程式,灰度值並不能很好的區分背景色和前景色,尤其是對於漸進的背景來說,所以我們還要將影象進一步處理,就是將灰度2...
驗證碼識別(C )
1 如何設前景 背景的分界值 uncodebase類中有乙個getpicvalidbyvalue int dggrayvalue 函式,可以得到前景的有效區域,常有人問我 前景 背景的分界值dggrayvalue是如何確定的 常用的是灰度128 這個值的獲取是有數學演算法,叫最大類間方差法,即影象的...
C 識別驗證碼
今天跟大家一起分享切分和識別,在這裡就要有個分支,切分有兩個情況,乙個是分開的字元的切分和識別,另乙個是連在一起的字元的切分和識別。今天先共享分開字元的識別,仍然是原始碼共享。首先要說一下原理,在網上的很多 在切分的時候,很的情況會導致切分失敗,比如字元的左右位置不固定。所以在切分的時候,我採用的方...