python驗證碼識別教程之灰度處理、二值化牍蜂、降噪與tesserocr識別

寫爬蟲有一個繞不過去的問題就是驗證碼漾根,現(xiàn)在驗證碼分類大概有4種:

圖像類

滑動類

點擊類

語音類

今天先來看看圖像類,這類驗證碼大多是數(shù)字鲫竞、字母的組合辐怕,國內(nèi)也有使用漢字的。在這個基礎(chǔ)上增加噪點从绘、干擾線寄疏、變形、重疊僵井、不同字體顏色等方法來增加識別難度陕截。

相應(yīng)的,驗證碼識別大體可以分為下面幾個步驟:

灰度處理

增加對比度(可選)

二值化

降噪

傾斜校正分割字符

建立訓(xùn)練庫

識別

由于是實驗性質(zhì)的批什,文中用到的驗證碼均為程序生成而不是批量下載真實的網(wǎng)站驗證碼农曲,這樣做的好處就是可以有大量的知道明確結(jié)果的數(shù)據(jù)集。

當需要真實環(huán)境下需要獲取數(shù)據(jù)時驻债,可以使用結(jié)合各個大碼平臺來建立數(shù)據(jù)集進行訓(xùn)練乳规。

生成驗證碼這里我使用Claptcha本地下載)這個庫,當然Captcha本地下載)這個庫也是個不錯的選擇合呐。

為了生成最簡單的純數(shù)字暮的、無干擾的驗證碼,首先需要將claptcha.py的285行_drawLine做一些修改淌实,我直接讓這個函數(shù)返回None冻辩,然后開始生成驗證碼:

from? claptcha? import? Claptcha

c =Claptcha("8069","/usr/share/fonts/truetype/freefont/FreeMono.ttf")

t,_ =c.write('1.png')


這里需要注意ubuntu的字體路徑,也可以在網(wǎng)上下載其他字體使用翩伪。生成驗證碼如下:

可以看出微猖,驗證碼有形變。對于這類最簡單的驗證碼缘屹,可以直接使用谷歌開源的tesserocr來識別凛剥。

首先安裝:

apt-get? install? tesseract-ocr libtesseract-dev libleptonica-dev

pip installtesserocr

然后開始識別:

from? PIL? import? Image

import tesserocr

p1 =Image.open('1.png')

tesserocr.image_to_text(p1)

'8069\n\n'

可以看出,對于這種簡單的驗證碼轻姿,基本什么都不做識別率就已經(jīng)很高了犁珠。有興趣的小伙伴可以用更多的數(shù)據(jù)來測試逻炊,這里我就不展開了。

接下來犁享,在驗證碼背景添加噪點來看看:

c =Claptcha("8069","/usr/share/fonts/truetype/freefont/FreeMono.ttf",noise=0.4)

t,_ =c.write('2.png')

生成驗證碼如下:

識別:

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')

生成驗證碼如下:

第3個為小寫字母o,第4個為大寫字母O炊昆,第5個為數(shù)字0桨吊,第6個為小寫字母z,第7個為大寫字母Z凤巨,最后一個是數(shù)字2视乐。人眼已經(jīng)跪了有木有!但現(xiàn)在一般驗證碼對大小寫是不做嚴格區(qū)分的敢茁,看自動識別什么樣吧:

p3 =Image.open('3.png')

tesserocr.image_to_text(p3)

'AMOOZW\n\n'

人眼都跪的計算機當然也廢了佑淀。但是么鹤,對于一些干擾小院塞、形變不嚴重的米同,使用tesserocr還是十分簡單方便的蟆沫。然后將修改的claptcha.py的285行_drawLine還原,看添加干擾線的情況柴信。

p4 =Image.open('4.png')

tesserocr.image_to_text(p4)

加了條干擾線就完全識別不出來了茉唉,那么有沒有什么辦法去除干擾線呢岸夯?

雖然圖片看上去是黑白的瓶堕,但還需要進行灰度處理隘道,否則使用load()函數(shù)得到的是某個像素點的RGB元組而不是單一值了症歇。處理如下:

def? ?binarizing(img,threshold):

?"""傳入image對象進行灰度郎笆、二值處理"""

?img =img.convert("L") # 轉(zhuǎn)灰度

?pixdata =img.load()

?w, h =img.size

?# 遍歷所有像素,大于閾值的為黑色

?fory inrange(h):

??forx inrange(w):

???ifpixdata[x, y] < threshold:

????pixdata[x, y] =0

???else:

????pixdata[x, y] =255

?return? img

處理后的圖片如下:

可以看出處理后圖片銳化了很多忘晤,接下來嘗試去除干擾線宛蚓,常見的4鄰域、8鄰域算法设塔。所謂的X鄰域算法凄吏,可以參考手機九宮格輸入法,按鍵5為要判斷的像素點闰蛔,4鄰域就是判斷上下左右痕钢,8鄰域就是判斷周圍8個像素點。如果這4或8個點中255的個數(shù)大于某個閾值則判斷這個點為噪音序六,閾值可以根據(jù)實際情況修改任连。

def? depoint(img):

?"""傳入二值化后的圖片進行降噪"""

?pixdata =img.load()

?w,h =img.size

?fory inrange(1,h-1):

??forx inrange(1,w-1):

???count =0

???ifpixdata[x,y-1] > 245:#上

????count =count +1

???ifpixdata[x,y+1] > 245:#下

????count =count +1

???ifpixdata[x-1,y] > 245:#左

????count =count +1

???ifpixdata[x+1,y] > 245:#右

????count =count +1

???ifpixdata[x-1,y-1] > 245:#左上

????count =count +1

???ifpixdata[x-1,y+1] > 245:#左下

????count =count +1

???ifpixdata[x+1,y-1] > 245:#右上

????count =count +1

???ifpixdata[x+1,y+1] > 245:#右下

????count =count +1

???ifcount > 4:

????pixdata[x,y] =255

?return? img

處理后的圖片如下:

好像……根本沒卵用啊例诀?随抠!確實是這樣的裁着,因為示例中的圖片干擾線的寬度和數(shù)字是一樣的。對于干擾線和數(shù)據(jù)像素不同的拱她,比如Captcha生成的驗證碼:

從左到右依次是原圖二驰、二值化、去除干擾線的情況秉沼,總體降噪的效果還是比較明顯的桶雀。另外降噪可以多次執(zhí)行,比如我對上面的降噪后結(jié)果再進行依次降噪唬复,可以得到下面的效果:

再進行識別得到了結(jié)果:

p7 =Image.open('7.png')

tesserocr.image_to_text(p7)

'8069 ,,\n\n'

另外背犯,從圖片來看,實際數(shù)據(jù)顏色明顯和噪點干擾線不同盅抚,根據(jù)這一點可以直接把噪點全部去除漠魏,這里就不展開說了。

第一篇文章妄均,先記錄如何將圖片進行灰度處理柱锹、二值化、降噪丰包,并結(jié)合tesserocr來識別簡單的驗證碼禁熏,剩下的部分在下一篇文章中和大家一起分享。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末邑彪,一起剝皮案震驚了整個濱河市瞧毙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌寄症,老刑警劉巖宙彪,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異有巧,居然都是意外死亡释漆,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門篮迎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來男图,“玉大人,你說我怎么就攤上這事甜橱⊙钒剩” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵岂傲,是天一觀的道長难裆。 經(jīng)常有香客問我,道長譬胎,這世上最難降的妖魔是什么差牛? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任命锄,我火速辦了婚禮,結(jié)果婚禮上偏化,老公的妹妹穿的比我還像新娘脐恩。我一直安慰自己,他們只是感情好侦讨,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布驶冒。 她就那樣靜靜地躺著,像睡著了一般韵卤。 火紅的嫁衣襯著肌膚如雪骗污。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天沈条,我揣著相機與錄音需忿,去河邊找鬼。 笑死蜡歹,一個胖子當著我的面吹牛屋厘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播月而,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼汗洒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了父款?” 一聲冷哼從身側(cè)響起溢谤,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎憨攒,沒想到半個月后世杀,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡浓恶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年玫坛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片包晰。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖炕吸,靈堂內(nèi)的尸體忽然破棺而出伐憾,到底是詐尸還是另有隱情,我是刑警寧澤赫模,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布树肃,位于F島的核電站,受9級特大地震影響瀑罗,放射性物質(zhì)發(fā)生泄漏胸嘴。R本人自食惡果不足惜雏掠,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望劣像。 院中可真熱鬧乡话,春花似錦、人聲如沸耳奕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽屋群。三九已至闸婴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間芍躏,已是汗流浹背邪乍。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留对竣,地道東北人溺欧。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像柏肪,于是被迫代替她去往敵國和親姐刁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容