Python OCR识别图片验证码(二)

来源:互联网 发布:知乎书店办公楼 编辑:程序博客网 时间:2024/06/07 11:46

操作系统:Windows
Python:3.5
欢迎加入学习交流QQ群:657341423


上节讲到验证码的简单识别

但对于一些复杂的验证码,我们需要做一些简单的图片处理才能识别。

例如,我要识别这些验证码:
这里写图片描述

设计思路:首先将图片变灰,然后转为RGBA,即四个通道,每个通道代表每种颜色,这个涉及到图片处理的一些基础知识。这个可以研究一下opencv。这个比较有意义。然后判断通道的颜色来转换成黑白色彩。便于OCR识别。

from PIL import Imagefrom PIL import ImageEnhancefrom PIL import ImageFilter  import sysimport os  import pytesseractfrom pyocr import tesseractimport timedef eachFile(filepath):    pathDir =  os.listdir(filepath)    for allDir in pathDir:        child = os.path.join('%s%s' % (filepath, allDir))        if "jpg" in child:            jpgList.append(child)def OutCode(code):    file=open(SettingFile+"data.txt",'w')    file.write(code)    file.close()    print (code)# 黑白反色,白色替换  # 此处N直接为255  # 小于N的 被替换成黑色  # 大于等于N的 被替换成白色,255代表白色,0代表黑色if __name__=='__main__':    while 1:        SettingFile="D:\\"        jpgList=[]        eachFile(SettingFile)        for i in jpgList:            try:                im = Image.open(i)                im=im.convert('L')#图片转换为灰色图像                im=im.convert('RGBA')#图片转换成RGBA模式                pixdata = im.load()                for y in range(im.size[1]):                    for x in range(im.size[0]):                    #循环图像里的每一个像素。每个像素为一个长度为4的列表。因为图片转换成RGBA模式,所以列表长度为4,A就是透明度                            if pixdata[x,y][0]>170 and pixdata[x,y][1]>170 and pixdata[x,y][2]>170 and pixdata[x,y][3]>170:                                pixdata[x,y]=(255, 255, 255, 0)                            else:                                  pixdata[x,y]=(0, 0, 0, 0)                im.save("asa.jpg")                #下面code与注释的code实现的功能一样                #code=pytesseract.image_to_string(im)                code=tesseract.image_to_string(im)                OutCode(code)                os.remove(i)            except Exception as e:                code="Unrecognized"                OutCode(code)                os.remove(i)        time.sleep(5)

这里我设计一个死循环,每隔五秒检测d盘下的jpg文件,然后输出识别后的结果。测试结果:
这里写图片描述

如图所示:asa.jpg为处理后的图片。然后给OCR识别。
当然,这个OCR识别永远都是有一定的准确率。这个是无法改变的。