操作系统:Windows
Python:3.5
欢迎加入学习交流QQ群:657341423
但对于一些复杂的验证码,我们需要做一些简单的图片处理才能识别。
例如,我要识别这些验证码:
设计思路:首先将图片变灰,然后转为RGBA,即四个通道,每个通道代表每种颜色,这个涉及到图片处理的一些基础知识。这个可以研究一下opencv。这个比较有意义。然后判断通道的颜色来转换成黑白色彩。便于OCR识别。
from PIL import Image
from PIL import ImageEnhance
from PIL import ImageFilter
import sys
import os
import pytesseract
from pyocr import tesseract
import time
def 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.png")
#下面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.png为处理后的图片。然后给OCR识别。
(建议将图片改为png格式)
当然,这个OCR识别永远都是有一定的准确率。这个是无法改变的。