上篇文章讲了模拟登录,在有些时候,我们想要登录成功,还需要通过一些验证,这次就来讲讲这种情况的处理
tesserocr模块
类似于下图中的这种验证,我们可以通过一个图片识别库 tesserocr 来进行识别
例如要识别这张图片
代码:
# 导入Image图片对象
from PIL import Image
# 导入图片识别包
import tesserocr
# open()方法获取要识别的图片
image = Image.open('CheckCode.png')
# image_to_text()方法将图片内容转化为文本
result = tesserocr.image_to_text(image)
# 打印转化结果
print(result)
结果:
但是有些时候由于干扰线条的存在,识别并不是很准确,我们需要去除线条来提高识别率
去除线条
1,先将彩色图片转为灰度图像
# 导入Image图片对象 from PIL import Image # 导入图片识别包 import tesserocr # open()方法获取要识别的图片 image = Image.open('CheckCode.png') # 参数‘L’将图片转为灰度图像 image = image.convert('L') # 显示图片 image.show()
结果:
可以看到虽然转为了灰度图像,但条纹还在
2.利用二值化去除条纹
什么是二值化?
可以这样去看待图像上的每个像素点:255代表纯黑,0代表纯白,127代表灰,可知比如234就代表比较黑,34代表挺白的......
我们将 [0 ~ 127] 的偏白的像素全部不要,将 [127 ~ 255] 的偏黑的像素全部保留,这样就没有灰色的线条干扰了,就可以提高识别率了
# 导入Image图片对象 from PIL import Image # 导入图片识别包 import tesserocr # open()方法获取要识别的图片 image = Image.open('CheckCode.png') # 参数‘L’将图片转为灰度图像 image = image.convert('L') # 显示图片 # image.show() # 设置筛选值 threshold = 127 # 设置一个存放像素信息的列表 table = [] # 色域为256 for i in range(256): # 如果像素偏白 if i < threshold: # 去除偏白的像素 table.append(0) # 像素偏黑 else: # 保留偏黑的像素 table.append(1) # 按像素信息绘制 image = image.point(table, '1') # 显示图片 image.show()
结果
这样得到的图片就黑白分明了,也能大大提高识别率了
全部代码:
# 导入Image图片对象
from PIL import Image
# 导入图片识别包
import tesserocr
# open()方法获取要识别的图片
image = Image.open('CheckCode.png')
# 参数‘L’将图片转为灰度图像
image = image.convert('L')
# 显示图片
# image.show()
# 设置筛选值
threshold = 127
# 设置一个存放像素信息的列表
table = []
# 色域为256
for i in range(256):
# 如果像素偏白
if i < threshold:
# 去除偏白的像素
table.append(0)
# 像素偏黑
else:
# 保留偏黑的像素
table.append(1)
# 按像素信息绘制
image = image.point(table, '1')
# 显示图片
# image.show()
# image_to_text()方法将图片内容转化为文本
result = tesserocr.image_to_text(image)
# 打印转化结果
print(result)