談?wù)凱ython進(jìn)行驗(yàn)證碼識(shí)別的一些想法
用python加“驗(yàn)證碼”為關(guān)鍵詞在baidu里搜一下,可以找到很多關(guān)于驗(yàn)證碼識(shí)別的文章。我大體看了一下,主要方法有幾類:一類是通過對(duì)圖片進(jìn)行處理,然后利用字庫(kù)特征匹配的方法,一類是圖片處理后建立字符對(duì)應(yīng)字典,還有一類是直接利用ocr模塊進(jìn)行識(shí)別。不管是用什么方法,都需要首先對(duì)圖片進(jìn)行處理,于是試著對(duì)下面的驗(yàn)證碼進(jìn)行分析。
一、圖片處理
這個(gè)驗(yàn)證碼中主要的影響因素是中間的曲線,首先考慮去掉圖片中的曲線。考慮了兩種算法:
第一種是首先取到曲線頭的位置,即x=0時(shí),黑點(diǎn)的位置。然后向后移動(dòng)x的取值,觀察每個(gè)x下黑點(diǎn)的位置,判斷前后兩個(gè)相鄰黑點(diǎn)之間的距離,如果距離在一定范圍內(nèi),可以基本判斷該點(diǎn)是曲線上的點(diǎn),最后將曲線上的點(diǎn)全部繪成白色。試了一下這種方法,結(jié)果得到的圖片效果很一般,曲線不能完全去除,而且容量將字符的線條去除。
第二種考慮用單位面積內(nèi)點(diǎn)的密度來進(jìn)行計(jì)算。于是首先計(jì)算單位面積內(nèi)點(diǎn)的個(gè)數(shù),將單位面積內(nèi)點(diǎn)個(gè)數(shù)少于某一指定數(shù)的面積去除,剩余的部分基本上就是驗(yàn)證碼字符的部分。本例中,為了便于操作,取了5*5做為單位范圍,并調(diào)整單位面積內(nèi)點(diǎn)的標(biāo)準(zhǔn)密度為11。處理后的效果:
二、字符驗(yàn)證
這里我使用的方法是利用pytesser進(jìn)行ocr識(shí)別,但由于這類驗(yàn)證碼字符的不規(guī)則性,使得驗(yàn)證結(jié)果的準(zhǔn)確性并不是很高。具體哪位大牛,有什么好的辦法,希望能給指點(diǎn)一下。
三、準(zhǔn)備工作與代碼實(shí)例
1、PIL、pytesser、tesseract
(1)安裝PIL:下載地址:http://www.pythonware.com/products/pil/
(2)pytesser:下載地址:http://code.google.com/p/pytesser/,下載解壓后直接放在代碼相同的文件夾下,即可使用。
(3)Tesseract OCR engine下載:http://code.google.com/p/tesseract-ocr/,下載后解壓,找到tessdata文件夾,用其替換掉pytesser解壓后的tessdata文件夾即可。
2、具體代碼
#encoding=utf-8 ###利用點(diǎn)的密度計(jì)算 import Image,ImageEnhance,ImageFilter,ImageDraw import sys from pytesser import * #計(jì)算范圍內(nèi)點(diǎn)的個(gè)數(shù) def numpoint(im): w,h = im.size data = list( im.getdata() ) mumpoint=0 for x in range(w): for y in range(h): if data[ y*w + x ] !=255:#255是白色 mumpoint+=1 return mumpoint #計(jì)算5*5范圍內(nèi)點(diǎn)的密度 def pointmidu(im): w,h = im.size p=[] for y in range(0,h,5): for x in range(0,w,5): box = (x,y, x+5,y+5) im1=im.crop(box) a=numpoint(im1) if a<11:##如果5*5范圍內(nèi)小于11個(gè)點(diǎn),那么將該部分全部換為白色。 for i in range(x,x+5): for j in range(y,y+5): im.putpixel((i,j), 255) im.save(r'img.jpg') def ocrend():##識(shí)別 image_name = "img.jpg" im = Image.open(image_name) im = im.filter(ImageFilter.MedianFilter()) enhancer = ImageEnhance.Contrast(im) im = enhancer.enhance(2) im = im.convert('1') im.save("1.tif") print image_file_to_string('1.tif') if __name__=='__main__': image_name = "1.png" im = Image.open(image_name) im = im.filter(ImageFilter.DETAIL) im = im.filter(ImageFilter.MedianFilter()) enhancer = ImageEnhance.Contrast(im) im = enhancer.enhance(2) im = im.convert('1') ##a=remove_point(im) pointmidu(im) ocrend()
本人的這個(gè)方法,最終識(shí)別率確實(shí)不高,寫出來,哪位高手有好的思路或者做法,望不惜賜教!
- python實(shí)現(xiàn)驗(yàn)證碼識(shí)別功能
- python驗(yàn)證碼識(shí)別的實(shí)例詳解
- python下調(diào)用pytesseract識(shí)別某網(wǎng)站驗(yàn)證碼的實(shí)現(xiàn)方法
- Python驗(yàn)證碼識(shí)別處理實(shí)例
- 詳解Python驗(yàn)證碼識(shí)別
- Python驗(yàn)證碼識(shí)別的方法
- Python網(wǎng)站驗(yàn)證碼識(shí)別
- python入門教程之識(shí)別驗(yàn)證碼
- python+selenium識(shí)別驗(yàn)證碼并登錄的示例代碼
- python腳本實(shí)現(xiàn)驗(yàn)證碼識(shí)別
相關(guān)文章
Python3.5 Pandas模塊之DataFrame用法實(shí)例分析
這篇文章主要介紹了Python3.5 Pandas模塊之DataFrame用法,結(jié)合實(shí)例形式詳細(xì)分析了Python3.5中Pandas模塊的DataFrame結(jié)構(gòu)創(chuàng)建、讀取、過濾、獲取等相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2019-04-04怎么處理Python分割字符串時(shí)有多個(gè)分隔符
在使用Python處理字符串的時(shí)候,有時(shí)候會(huì)需要分割字符。本文就介紹了Python分割字符串時(shí)有多個(gè)分隔符,感興趣的可以了解一下2021-07-07Python爬蟲實(shí)戰(zhàn)案例之爬取喜馬拉雅音頻數(shù)據(jù)詳解
這篇文章主要介紹了Python爬蟲實(shí)戰(zhàn)案例之取喜馬拉雅音頻數(shù)據(jù)詳解,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12Python實(shí)現(xiàn)掃描局域網(wǎng)活動(dòng)ip(掃描在線電腦)
這篇文章主要介紹了Python實(shí)現(xiàn)掃描局域網(wǎng)活動(dòng)ip(掃描在線電腦),本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-04-04python flask中動(dòng)態(tài)URL規(guī)則詳解
今天小編就為大家分享一篇python flask中動(dòng)態(tài)URL規(guī)則詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-11-11使用已經(jīng)得到的keras模型識(shí)別自己手寫的數(shù)字方式
這篇文章主要介紹了使用已經(jīng)得到的keras模型識(shí)別自己手寫的數(shù)字方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-06-06python基礎(chǔ)教程之lambda表達(dá)式使用方法
lambda表達(dá)式相當(dāng)于函數(shù)體為單個(gè)return語句的普通函數(shù)的匿名函數(shù),本文主要介紹lambda表達(dá)式使用方法2014-02-02python3用PyPDF2解析pdf文件,用正則匹配數(shù)據(jù)方式
這篇文章主要介紹了python3用PyPDF2解析pdf文件,用正則匹配數(shù)據(jù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-05-05