C 下的驗證碼識別

2021-06-16 17:18:26 字數 2956 閱讀 3822

引言

演算法分析

驗證碼識別原理及**演示

[c-sharp]view plain

copy

print?

}  }  

灰度化之後,畫素的rgb三色都是相同的值了,亮度從0~255(hxff)。但用於識別程式,灰度值並不能很好的區分背景色和前景色,尤其是對於漸進的背景來說,所以我們還要將影象進一步處理,就是將灰度2值化,類似的演算法還有分水嶺演算法等。因為本文中的驗證碼相對簡單,故直接使用2值化轉換,尋找有效區並轉為單色黑白圖。

[c-sharp]view plain

copy

print?

}  }  

//確保能整除

int span = charscount - (posx2 - posx1 + 1) % charscount;  

//可整除的差額數

if (span < charscount)  

//複製新圖

rectangle clonerect = new rectangle(posx1, posy1, posx2 - posx1 + 1, posy2 - posy1 + 1);  

bmpobj = bmpobj.clone(clonerect, bmpobj.pixelformat);  

}  bitmap pics = getsplitpics(4, 1); //分割,pics[0]中的如圖2所示

圖2

[c-sharp]view plain

copy

print?

public bitmap getsplitpics(int rownum, int colnum)  

}  return picarray;  

}  

此時影象分割已結束,pics 的長度應該是4,並且每乙個pics就是乙個驗證碼的點陣圖,經過錯誤處理,修邊,和去除無用背景空白,修正完的點陣圖為數字0。

得到有效圖形後,由外面傳入該圖形,設定灰度背景分界值為「dggrayvalue」,有效字元數為charscount,程式編寫如下:

[c-sharp]view plain

copy

print?

public bitmap getpicvalidbyvalue(bitmap singlepic, int dggrayvalue)  

;  };  

};  

//複製新圖

rectangle clonerect = new rectangle(posx1, posy1, posx2 - posx1 + 1, posy2 - posy1 + 1);  

return singlepic.clone(clonerect, singlepic.pixelformat);  

}  

至此,pics影象組中就是有效的點陣圖了。下面我們把pics中的圖形轉換為代表點陣的字串,返回灰度的點陣描述字串,1表示灰點,0表示背景。設定灰度圖為singlepic,背前景灰色界限為dggrayvalue。

[c-sharp]view plain

copy

print?

string code = getsinglebmpcode(pics[0], 128);  

public

string getsinglebmpcode(bitmap singlepic, int dggrayvalue)  

return sbcode.tostring();  

}  

此時,code中的字串就代表字元0在工行wap銀行上影象驗證碼的值了;以此類推,我們可以得到乙個完整的,代表影象0~9的陣列,字元表的順序為0~9,a~z,a~z。

[c-sharp]view plain

copy

print?

string codearray = new

string ;  

開始處理比較操作:

[c-sharp]view plain

copy

print?

stringbuilder sbresult = new stringbuilder();  

}  for (int arrayindex = 0; arrayindex < codearray.length; arrayindex++) //和點陣表內的字串行進行比較

進行獲得匹配  

}  }  

至此,sbresult中的4個數字就是影象上的4個數字了。

結論

驗證碼識別肯定不只是這麼簡單,但現在還是有很多**都在用這種未經任何變換的驗證碼,所以我們的網路安全還任重而道遠。

上面的驗證碼識別是乙個最基本的演算法,但是很多擴充套件演算法都可以基於上面的思路進行擴充。例如有些驗證碼進行了旋轉輸出,那麼上面的程式可以在校對的時候,進行360度旋轉,旋轉後的影象再取得序列,再和影象序列比較,直至得到最符合的。有些驗證碼新增了邊框,此時我們可以先去掉邊框再進行切割匹配。

通過上面的演算法可以得出,我們今後在設計驗證碼的時候,應該注意如下因素:

1)在噪音等型別的使用上,盡力讓字元和用來混淆的前景和背景不容易區分,盡力讓噪音長得和字母一樣。

2)特別好的驗證碼的設計,要盡力發揮人類擅長而ai演算法不擅長的。比如粘連字元的分割和手寫體(通過印刷體做特別的變形也可以),而不要一味的去加一些看起來比較複雜的噪音或者其他的花哨東西。

3)從專業的機器視覺的角度來說,網路安全驗證碼的設計,一定要讓破解者在識別階段,反覆在低階視覺和高階視覺之間多反覆幾次才能識別出來,這樣可以大大降低破解難度和破解的準確率。

C 下的驗證碼識別

引言 演算法分析 驗證碼識別原理及 演示 for int i 0 i bmpobj.height i 遍歷高度 灰度化之後,畫素的rgb三色都是相同的值了,亮度從0 255 hxff 但用於識別程式,灰度值並不能很好的區分背景色和前景色,尤其是對於漸進的背景來說,所以我們還要將影象進一步處理,就是將...

驗證碼識別(C )

1 如何設前景 背景的分界值 uncodebase類中有乙個getpicvalidbyvalue int dggrayvalue 函式,可以得到前景的有效區域,常有人問我 前景 背景的分界值dggrayvalue是如何確定的 常用的是灰度128 這個值的獲取是有數學演算法,叫最大類間方差法,即影象的...

C 識別驗證碼

今天跟大家一起分享切分和識別,在這裡就要有個分支,切分有兩個情況,乙個是分開的字元的切分和識別,另乙個是連在一起的字元的切分和識別。今天先共享分開字元的識別,仍然是原始碼共享。首先要說一下原理,在網上的很多 在切分的時候,很的情況會導致切分失敗,比如字元的左右位置不固定。所以在切分的時候,我採用的方...