python驗(yàn)證碼識別的示例代碼
寫爬蟲有一個繞不過去的問題就是驗(yàn)證碼,現(xiàn)在驗(yàn)證碼分類大概有4種:
- 圖像類
- 滑動類
- 點(diǎn)擊類
- 語音類
今天先來看看圖像類,這類驗(yàn)證碼大多是數(shù)字、字母的組合,國內(nèi)也有使用漢字的。在這個基礎(chǔ)上增加噪點(diǎn)、干擾線、變形、重疊、不同字體顏色等方法來增加識別難度。
相應(yīng)的,驗(yàn)證碼識別大體可以分為下面幾個步驟:
- 灰度處理
- 增加對比度(可選)
- 二值化
- 降噪
- 傾斜校正分割字符
- 建立訓(xùn)練庫
- 識別
由于是實(shí)驗(yàn)性質(zhì)的,文中用到的驗(yàn)證碼均為程序生成而不是批量下載真實(shí)的網(wǎng)站驗(yàn)證碼,這樣做的好處就是可以有大量的知道明確結(jié)果的數(shù)據(jù)集。
當(dāng)需要真實(shí)環(huán)境下需要獲取數(shù)據(jù)時,可以使用結(jié)合各個大碼平臺來建立數(shù)據(jù)集進(jìn)行訓(xùn)練。
生成驗(yàn)證碼這里我使用Claptcha這個庫,當(dāng)然Captcha這個庫也是個不錯的選擇。
為了生成最簡單的純數(shù)字、無干擾的驗(yàn)證碼,首先需要將claptcha.py的285行_drawLine做一些修改,我直接讓這個函數(shù)返回None,然后開始生成驗(yàn)證碼:
from claptcha import Claptcha c = Claptcha("8069","/usr/share/fonts/truetype/freefont/FreeMono.ttf") t,_ = c.write('1.png')
這里需要注意ubuntu的字體路徑,也可以在網(wǎng)上下載其他字體使用。生成驗(yàn)證碼如下:
可以看出,驗(yàn)證碼有形變。對于這類最簡單的驗(yàn)證碼,可以直接使用谷歌開源的tesserocr來識別。
首先安裝:
apt-get install tesseract-ocr libtesseract-dev libleptonica-dev pip install tesserocr
然后開始識別:
from PIL import Image import tesserocr p1 = Image.open('1.png') tesserocr.image_to_text(p1) '8069\n\n'
可以看出,對于這種簡單的驗(yàn)證碼,基本什么都不做識別率就已經(jīng)很高了。有興趣的小伙伴可以用更多的數(shù)據(jù)來測試,這里我就不展開了。
接下來,在驗(yàn)證碼背景添加噪點(diǎn)來看看:
c = Claptcha("8069","/usr/share/fonts/truetype/freefont/FreeMono.ttf",noise=0.4) t,_ = c.write('2.png')
生成驗(yàn)證碼如下:
識別:
p2 = Image.open('2.png') tesserocr.image_to_text(p2) '8069\n\n'
效果還可以。接下來生成一個字母數(shù)字組合的:
c2 = Claptcha("A4oO0zZ2","/usr/share/fonts/truetype/freefont/FreeMono.ttf") t,_ = c2.write('3.png')
生成驗(yàn)證碼如下:
第3個為小寫字母o,第4個為大寫字母O,第5個為數(shù)字0,第6個為小寫字母z,第7個為大寫字母Z,最后一個是數(shù)字2。人眼已經(jīng)跪了有木有!但現(xiàn)在一般驗(yàn)證碼對大小寫是不做嚴(yán)格區(qū)分的,看自動識別什么樣吧:
p3 = Image.open('3.png') tesserocr.image_to_text(p3) 'AMOOZW\n\n'
人眼都跪的計算機(jī)當(dāng)然也廢了。但是,對于一些干擾小、形變不嚴(yán)重的,使用tesserocr還是十分簡單方便的。然后將修改的claptcha.py的285行_drawLine還原,看添加干擾線的情況。
p4 = Image.open('4.png') tesserocr.image_to_text(p4)
加了條干擾線就完全識別不出來了,那么有沒有什么辦法去除干擾線呢?
雖然圖片看上去是黑白的,但還需要進(jìn)行灰度處理,否則使用load()函數(shù)得到的是某個像素點(diǎn)的RGB元組而不是單一值了。處理如下:
def binarizing(img,threshold): """傳入image對象進(jìn)行灰度、二值處理""" img = img.convert("L") # 轉(zhuǎn)灰度 pixdata = img.load() w, h = img.size # 遍歷所有像素,大于閾值的為黑色 for y in range(h): for x in range(w): if pixdata[x, y] < threshold: pixdata[x, y] = 0 else: pixdata[x, y] = 255 return img
處理后的圖片如下:
可以看出處理后圖片銳化了很多,接下來嘗試去除干擾線,常見的4鄰域、8鄰域算法。所謂的X鄰域算法,可以參考手機(jī)九宮格輸入法,按鍵5為要判斷的像素點(diǎn),4鄰域就是判斷上下左右,8鄰域就是判斷周圍8個像素點(diǎn)。如果這4或8個點(diǎn)中255的個數(shù)大于某個閾值則判斷這個點(diǎn)為噪音,閾值可以根據(jù)實(shí)際情況修改。
def depoint(img): """傳入二值化后的圖片進(jìn)行降噪""" pixdata = img.load() w,h = img.size for y in range(1,h-1): for x in range(1,w-1): count = 0 if pixdata[x,y-1] > 245:#上 count = count + 1 if pixdata[x,y+1] > 245:#下 count = count + 1 if pixdata[x-1,y] > 245:#左 count = count + 1 if pixdata[x+1,y] > 245:#右 count = count + 1 if pixdata[x-1,y-1] > 245:#左上 count = count + 1 if pixdata[x-1,y+1] > 245:#左下 count = count + 1 if pixdata[x+1,y-1] > 245:#右上 count = count + 1 if pixdata[x+1,y+1] > 245:#右下 count = count + 1 if count > 4: pixdata[x,y] = 255 return img
處理后的圖片如下:
好像……根本沒卵用啊?!確實(shí)是這樣的,因?yàn)槭纠械膱D片干擾線的寬度和數(shù)字是一樣的。對于干擾線和數(shù)據(jù)像素不同的,比如Captcha生成的驗(yàn)證碼:
從左到右依次是原圖、二值化、去除干擾線的情況,總體降噪的效果還是比較明顯的。另外降噪可以多次執(zhí)行,比如我對上面的降噪后結(jié)果再進(jìn)行依次降噪,可以得到下面的效果:
再進(jìn)行識別得到了結(jié)果:
p7 = Image.open('7.png') tesserocr.image_to_text(p7) '8069 ,,\n\n'
另外,從圖片來看,實(shí)際數(shù)據(jù)顏色明顯和噪點(diǎn)干擾線不同,根據(jù)這一點(diǎn)可以直接把噪點(diǎn)全部去除,這里就不展開說了。
第一篇文章,先記錄如何將圖片進(jìn)行灰度處理、二值化、降噪,并結(jié)合tesserocr來識別簡單的驗(yàn)證碼,剩下的部分在下一篇文章中和大家一起分享。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python?Matplotlib實(shí)現(xiàn)三維數(shù)據(jù)的散點(diǎn)圖繪制
這篇文章主要為大家詳細(xì)介紹了Python?Matplotlib實(shí)現(xiàn)三維數(shù)據(jù)的散點(diǎn)圖繪制,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-03-03Python利用卡方Chi特征檢驗(yàn)實(shí)現(xiàn)提取關(guān)鍵文本特征
卡方檢驗(yàn)最基本的思想就是通過觀察實(shí)際值與理論值的偏差來確定理論的正確與否。本文將利用卡方Chi特征檢驗(yàn)實(shí)現(xiàn)提取關(guān)鍵文本特征功能,感興趣的可以了解一下2022-12-12python使用xlsxwriter實(shí)現(xiàn)有向無環(huán)圖到Excel的轉(zhuǎn)換
這篇文章主要為大家詳細(xì)介紹了python使用xlsxwriter實(shí)現(xiàn)有向無環(huán)圖到Excel的轉(zhuǎn)換,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-12-12Python OpenCV實(shí)現(xiàn)裁剪并保存圖片
這篇文章主要為大家詳細(xì)介紹了Python OpenCV實(shí)現(xiàn)裁剪并保存圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-07-07Django自帶的用戶驗(yàn)證系統(tǒng)實(shí)現(xiàn)
這篇文章主要介紹了Django自帶的用戶驗(yàn)證系統(tǒng)實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12python3?http.client?網(wǎng)絡(luò)請求方式
這篇文章主要介紹了python3?http.client?網(wǎng)絡(luò)請求方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09使用Python通過oBIX協(xié)議訪問Niagara數(shù)據(jù)的示例
這篇文章主要介紹了使用Python通過oBIX協(xié)議訪問Niagara數(shù)據(jù)的示例,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下2020-12-12