【python】爬虫如何识别验证码之图形验证码(转灰度+二值化)

问题描述:

图形验证码一般由验证码、干扰线、干扰点组合而成,其中,验证码内容由数字和字母随机组合形成。每次切换验证码,验证码字体颜色和背景颜色可能会发生变化。

本篇博文主要使用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

 

发布了27 篇原创文章 · 获赞 8 · 访问量 8538

猜你喜欢

转载自blog.csdn.net/weixin_44322399/article/details/104289459