谈谈Python进行验证码识别的一些想法
用python加“验证码”为关键词在baidu里搜一下,可以找到很多关于验证码识别的文章。我大体看了一下,主要方法有几类:一类是通过对图片进行处理,然后利用字库特征匹配的方法,一类是图片处理后建立字符对应字典,还有一类是直接利用ocr模块进行识别。不管是用什么方法,都需要首先对图片进行处理,于是试着对下面的验证码进行分析。 一、图片处理 这个验证码中主要的影响因素是中间的曲线,首先考虑去掉图片中的曲线。考虑了两种算法: 二、字符验证 这里我使用的方法是利用pytesser进行ocr识别,但由于这类验证码字符的不规则性,使得验证结果的准确性并不是很高。具体哪位大牛,有什么好的办法,希望能给指点一下。 三、准备工作与代码实例 1、PIL、pytesser、tesseract (1)安装PIL:下载地址:http://www.pythonware.com/products/pil/ 2、具体代码 #encoding=utf-8 ###利用点的密度计算 import Image,ImageEnhance,ImageFilter,ImageDraw import sys from pytesser import * #计算范围内点的个数 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 #计算5*5范围内点的密度 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范围内小于11个点,那么将该部分全部换为白色。 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() 本人的这个方法,最终识别率确实不高,写出来,哪位高手有好的思路或者做法,望不惜赐教! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |