一、前言
1、安装tesseract,确认命令:tesseract -v
tesseract 4.1.1
leptonica-1.79.0
libgif 5.2.1 : libjpeg 9d : libpng 1.6.37 : libtiff 4.1.0 : zlib 1.2.11 : libwebp 1.1.0 : libopenjp2 2.3.1
2、可以使用操作系统已有字体,也可以自己去下载
二、创建验证码
源码及注释:
from PILimport Image,ImageDraw, ImageFont, ImageFilter
import random
#随机字母
def rndChar():
return chr(random.randint(65,90))
#随机颜色1
def rndColor():
return (random.randint(64,255),random.randint(64,255),random.randint(64,255))
#随机颜色2
def rndColor2():
return (random.randint(32,127),random.randint(32,127),random.randint(32,127))
#width * height = 240 * 60
width =60*4
height =60
image = Image.new('RGB', (width, height), (255,255,255))
#创建Font对象
font = ImageFont.truetype('/System/Library/Fonts/Times.ttc',36)
#创建Draw对象
draw = ImageDraw.Draw(image)
#填充每个像素
for xin range(width):
for yin range(height):
draw.point((x, y),fill=rndColor())
#输出数字
for tin range(4):
draw.text((60*t+10,10), rndChar(),font=font,fill=(0,0,0))
#模糊
image = image.filter(ImageFilter.BLUR)
image.save('code.jpg','jpeg')
image.show()
结果如下:
三、识别验证码
1、方法1
import pytesseract
import re
from PILimport Image
#获取图片
"""
预处理:将图片进行降噪处理,通过二值法去掉后面的背景色并加深文字对比度
在PIL中,从模式RGB转换为L公式:L=R*299/1000 + G*587/1000 + B*114/1000
"""
def convert_image(img, standard=127.5):
image = img.convert('L')#从彩色转换为灰度
"""
二值法,根据阈值,将所有像素都置为0(黑色)或255(白色),便于接下来的分割
getpixel((x,y))返回给定位置的像素值。
如果图像是RGB,则为多通道,返回一个元组。如果mode=L,是单通道,返回一个0-255之间的整数值。
"""
pixels = image.load()
for xin range(image.width):
for yin range(image.height):
if pixels[x,y] > standard:
pixels[x,y] =255
else:
pixels[x,y] =0
return image
#识别:使用pytesseract库来识别图片中的字符
def change_image_to_text(img):
textCode = pytesseract.image_to_string(img,lang='eng')
return textCode
if __name__ =='__main__':
print(change_image_to_text('code.jpg'))
print(change_image_to_text('code2.jpg'))
print(change_image_to_text('code5.jpg'))
print(change_image_to_text('GaussianBlur.jpg'))
结果如下:
2、方法2
import pytesseract
import re
from PILimport Image
#另一种识别方法
def getCode2(image):
image = Image.open(image)
#把图片转成L单通道,这样像素点的值就落在[0,255]之间,区别于RGB的三通道像素点区间[0~255,0~255,0~255]
im = image.convert('L')
#把图片上下两条边框设置为黑色
for xin range(im.size[0]):
im.putpixel((x,0),0)
im.putpixel((x,im.size[1]-1),0)
#把图片左右两条边框设置为黑色
for yin range(im.size[1]):
im.putpixel((0,y),0)
im.putpixel((im.size[0]-1,y),0)
#将图片像素值在150以上设置为白色,否则为黑色
for iin range(im.size[0]):
for jin range(im.size[1]):
if(im.getpixel((i,j)) >100):
im.putpixel((i,j),255)
else:
im.putpixel((i, j),0)
code = pytesseract.image_to_string(im)
print(code)
if __name__ =='__main__':
getCode2('code.jpg')
getCode2('code2.jpg')
getCode2('code5.jpg')
getCode2('GaussianBlur.jpg')
结果如下: