其實(shí)關(guān)于驗(yàn)證碼識別涉及很多方面的內(nèi)容,入手難度大,但是入手后,可拓展性又非常廣泛,可玩性極強(qiáng),成就感也很足,對這感興趣的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。
依賴
1
2
3
|
sudo apt - get install python - imaging sudo apt - get install tesseract - ocr pip install pytesseract |
利用google ocr來識別驗(yàn)證碼
1
2
3
4
5
|
from PIL import Image import pytesseract image = Image. open ( 'v1.jpg' ) vcode = pytesseract.image_to_string(image) print vcode |
但是pytesseract
本身識別率不高,而且一般網(wǎng)站的驗(yàn)證碼都帶有大量干擾元素。( ̄▽ ̄)"
所以我們首先要對驗(yàn)證碼進(jìn)行去噪。
對于單像素干擾線、干擾點(diǎn)我們可以通過掃描整個圖像,考察每一個像素點(diǎn)所臨近的八個像素點(diǎn)的顏色,如果不同的個數(shù)大于一定的值,那就說明該點(diǎn)是離散點(diǎn),需要去除。
另外也可以嘗試設(shè)定閾值來直接將驗(yàn)證碼二值化。
下面是兩張學(xué)校網(wǎng)站上的驗(yàn)證碼
我們可以看到驗(yàn)證碼存在單像素干擾點(diǎn),所以我們需要設(shè)法去除。但是經(jīng)過反復(fù)刷新驗(yàn)證碼,發(fā)現(xiàn)這個驗(yàn)證碼
1. 只有加法運(yùn)算
2.至多兩位數(shù)的加法
3.文字部分一定是紅色(255,0,0)
有了上述的信息,可以判斷這個驗(yàn)證碼的生成算法是有缺陷的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
import Image from numpy import * import pytesseract im = Image. open ( '1.png' ) im = im.convert( 'RGB' ) #拉長圖像,方便識別。 im = im.resize(( 200 , 80 )) a = array(im) for i in xrange ( len (a)): for j in xrange ( len (a[i])): if a[i][j][ 0 ] = = 255 : a[i][j] = [ 0 , 0 , 0 ] else : a[i][j] = [ 255 , 255 , 255 ] im = Image.fromarray(a) im.show() vcode = pytesseract.image_to_string(im) print vcode |
利用上述腳本我們可以將圖像進(jìn)行二值化,利用google ocr進(jìn)行識別。再通過eval()
來對表達(dá)式進(jìn)行求值。
總結(jié)
python驗(yàn)證碼識別的內(nèi)容到這就基本介紹了,希望這篇文章對大家的學(xué)習(xí)或者工作能有所幫助,如果有疑問大家可以留言交流。