国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

談?wù)凱ython進(jìn)行驗(yàn)證碼識別的一些想法

2020-01-04 17:48:44
字體:
供稿:網(wǎng)友
關(guān)于python驗(yàn)證碼識別,主要方法有幾類:一類是通過對圖片進(jìn)行處理,然后利用字庫特征匹配的方法,一類是圖片處理后建立字符對應(yīng)字典,還有一類是直接利用ocr模塊進(jìn)行識別。不管是用什么方法,都需要首先對圖片進(jìn)行處理,于是試著對下面的驗(yàn)證碼進(jìn)行分析
 

用python加“驗(yàn)證碼”為關(guān)鍵詞在baidu里搜一下,可以找到很多關(guān)于驗(yàn)證碼識別的文章。我大體看了一下,主要方法有幾類:一類是通過對圖片進(jìn)行處理,然后利用字庫特征匹配的方法,一類是圖片處理后建立字符對應(yīng)字典,還有一類是直接利用ocr模塊進(jìn)行識別。不管是用什么方法,都需要首先對圖片進(jìn)行處理,于是試著對下面的驗(yàn)證碼進(jìn)行分析。

一、圖片處理

談?wù)凱ython進(jìn)行驗(yàn)證碼識別的一些想法

這個驗(yàn)證碼中主要的影響因素是中間的曲線,首先考慮去掉圖片中的曲線。考慮了兩種算法:
第一種是首先取到曲線頭的位置,即x=0時,黑點(diǎn)的位置。然后向后移動x的取值,觀察每個x下黑點(diǎn)的位置,判斷前后兩個相鄰黑點(diǎn)之間的距離,如果距離在一定范圍內(nèi),可以基本判斷該點(diǎn)是曲線上的點(diǎn),最后將曲線上的點(diǎn)全部繪成白色。試了一下這種方法,結(jié)果得到的圖片效果很一般,曲線不能完全去除,而且容量將字符的線條去除。
第二種考慮用單位面積內(nèi)點(diǎn)的密度來進(jìn)行計算。于是首先計算單位面積內(nèi)點(diǎn)的個數(shù),將單位面積內(nèi)點(diǎn)個數(shù)少于某一指定數(shù)的面積去除,剩余的部分基本上就是驗(yàn)證碼字符的部分。本例中,為了便于操作,取了5*5做為單位范圍,并調(diào)整單位面積內(nèi)點(diǎn)的標(biāo)準(zhǔn)密度為11。處理后的效果:

談?wù)凱ython進(jìn)行驗(yàn)證碼識別的一些想法

二、字符驗(yàn)證

這里我使用的方法是利用pytesser進(jìn)行ocr識別,但由于這類驗(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)的密度計算import Image,ImageEnhance,ImageFilter,ImageDrawimport sysfrom pytesser import *#計算范圍內(nèi)點(diǎn)的個數(shù)def numpoint(im):w,h = im.sizedata = list( im.getdata() )mumpoint=0for x in range(w):for y in range(h):if data[ y*w + x ] !=255:#255是白色mumpoint+=1return mumpoint#計算5*5范圍內(nèi)點(diǎn)的密度def pointmidu(im):w,h = im.sizep=[]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個點(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():##識別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()

本人的這個方法,最終識別率確實(shí)不高,寫出來,哪位高手有好的思路或者做法,望不惜賜教!


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 玉山县| 萝北县| 平昌县| 许昌市| 武穴市| 改则县| 蕉岭县| 达拉特旗| 白河县| 哈尔滨市| 永城市| 兴业县| 射洪县| 中卫市| 历史| 天津市| 体育| 深水埗区| 久治县| 焦作市| 秦皇岛市| 虹口区| 铁力市| 临澧县| 大庆市| 伊宁市| 靖江市| 常宁市| 白玉县| 广南县| 剑河县| 绵阳市| 措美县| 鹰潭市| 叶城县| 定南县| 宜春市| 金寨县| 屏南县| 噶尔县| 临高县|