问题描述:
图形验证码一般由验证码、干扰线、干扰点组合而成,其中,验证码内容由数字和字母随机组合形成。每次切换验证码,验证码字体颜色和背景颜色可能会发生变化。
本篇博文主要使用python的tesserocr库对该验证码进行识别,因此python需已安装配置了tesserocr库,windows系统下的tesserocr库的安装与配置过程可以参考这篇博文:https://blog.csdn.net/weixin_44322399/article/details/104238742。
这里以中国知网的图形验证码为例,中国知网的验证码生成地址:http://my.cnki.net/Register/CheckCode.aspx,打开该链接后,可以看到一张图形验证码,右键保存到桌面即可。(可以多保存几张来验证代码)
解决方法:
情况一:干扰较少
>>> import tesserocr
>>> from PIL import Image
>>> image = Image.open('1.jpg')
>>> result = tesserocr.image_to_text(image)
>>> print(result)
ge7c
情况二:干扰较多
首先,尝试使用上列代码对上图进行OCR识别, 返回下图结果,与图形上的验证码并不相符:
>>> import tesserocr
>>> from PIL import Image
>>> image = Image.open('2.jpg')
>>> result = tesserocr.image_to_text(image)
>>> print(result)
L V5]
由于验证码内的多余线条的干扰,需要进一步的图片处理操作。
(1)转灰度
>>> image = image.convert('L')
>>> image.show()
解释:向convert()方法中传参数L,即可将图片转化成灰度图片,如下图展示效果。
扫描二维码关注公众号,回复:
9122135 查看本文章
(2)二值化
二值化是指将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。在灰度化的图像中灰度值的范围为0~255,在二值化后的图像中的灰度值范围是0或者255。
>>> image = image.convert('1')
>>> image.show()
解释:向convert()方法中传参数1,可以得到二值化的图片,如下图展示效果。
我们可以指定二值化的阈值,不过需要先将图片灰度化,图片每个像素点有了其对应的值,再与阈值进行判断。
import tesserocr
from PIL import Image
image = Image.open('2.jpg')
image = image.convert('L')
//127是0~255的中数,以127为二值化阈值
//判断小于127为0(黑色),大于127为1(白色)
threshold = 127
table = []
for i in range(256):
if i < threshold:
table.append(0)
else:
table.append(1)
image = image.point(table,'1')
result = tesserocr.image_to_text(image).replace(" ","")
print(result)
LVcl