前言
这一期我们利用Python实现简单的图片验证码识别
废话不多说,让我们愉快地开始吧~
开发工具
Python版本: 3.7.4
相关模块:
tesserocr模块;
以及一些python自带的模块。
环境搭建
安装Python并添加到环境变量,pip安装需要的相关模块即可。
图片验证码的识别
我们首先做最简单的一种验证码,即图形验证码。这种验证码出现的最早,现在也很常见,一般由4位字母或数字组成。
举个简单的例子,中国知网的注册页面就有类似的验证码。网页链接如下:
https://my.cnki.net/Register/CommonRegister.aspx
表单的最后一项就是图形验证码,我们必须完全正确的输入图中的字符才可以完成注册。
获取验证码
为了便于实验,我们先将验证码的图片保存下来。
打开开发者工具,找到验证码元素。验证码元素是一张图片,这张图片的链接是:
https://my.cnki.net/Register/CheckCode.aspx
打开链接就可以看到一张,图片,那个就是图片验证码,如下图所示:
识别测试
将验证码图片放在项目的根目录下,用tesserocr库识别该验证码,代码如下所示:
import tesserocr
from PIL import Image
image = Image.open('test3.jpg')
result = tesserocr.image_to_text(image)
print(result)
首先创建了一个image对象,然后调用了tesserocr下的image_to_text()方法。传入该image对象即可完成识别。
然而,有些时候也难免会识别错误。因此,我们需要对图片再做处理,如转灰度、二值化操作。
我们可以利用Image对象的convert()方法传入参数L,即可将图片转化为灰度图像。
具体代码,如下所示:
from PIL import Image
image = Image.open('test3.jpg')
image = image.convert('L')
image.show()
传入1,即可将图片进行二值化处理,如下所示:
import tesserocr
from PIL import Image
image = Image.open('test3.jpg')
image = image.convert('1')
image.show()
我们还可以指定二值化的阀值。上面的方法采用的是默认阀值127.不过,我们不能直接转化为原图,首先要将原图先转为灰度图像,然后再制定阀值,当我们把验证码中的线条都去掉之后再重新来识别图片,会更加准确。
具体代码,如下所示:
import tesserocr
from PIL import Image
image = Image.open('test3.jpg')
image = image.convert('L')
threshold = 123 # 指定阀值
table = []
for i in range(256):
if i < threshold:
table.append(0)
else:
table.append(1)
image = image.point(table, '1')
image.show()
result = tesserocr.image_to_text(image)
print(result)