首页 > 编程 > Python > 正文

python验证码识别教程之灰度处理、二值化、降噪与tesserocr识别

2020-02-15 21:37:27
字体:
来源:转载
供稿:网友

前言

写爬虫有一个绕不过去的问题就是验证码,现在验证码分类大概有4种:

    图像类 滑动类 点击类 语音类

今天先来看看图像类,这类验证码大多是数字、字母的组合,国内也有使用汉字的。在这个基础上增加噪点、干扰线、变形、重叠、不同字体颜色等方法来增加识别难度。

相应的,验证码识别大体可以分为下面几个步骤:

    灰度处理 增加对比度(可选) 二值化 降噪 倾斜校正分割字符 建立训练库 识别

由于是实验性质的,文中用到的验证码均为程序生成而不是批量下载真实的网站验证码,这样做的好处就是可以有大量的知道明确结果的数据集。

当需要真实环境下需要获取数据时,可以使用结合各个大码平台来建立数据集进行训练。

生成验证码这里我使用Claptcha (本地下载)这个库,当然Captcha(本地下载)这个库也是个不错的选择。

为了生成最简单的纯数字、无干扰的验证码,首先需要将claptcha.py的285行_drawLine做一些修改,我直接让这个函数返回None,然后开始生成验证码:

from claptcha import Claptchac = Claptcha("8069","/usr/share/fonts/truetype/freefont/FreeMono.ttf")t,_ = c.write('1.png')

这里需要注意ubuntu的字体路径,也可以在网上下载其他字体使用。生成验证码如下:


可以看出,验证码有形变。对于这类最简单的验证码,可以直接使用谷歌开源的tesserocr来识别。

首先安装:

apt-get install tesseract-ocr libtesseract-dev libleptonica-devpip install tesserocr

然后开始识别:

from PIL import Imageimport tesserocrp1 = Image.open('1.png')tesserocr.image_to_text(p1)'8069/n/n'

可以看出,对于这种简单的验证码,基本什么都不做识别率就已经很高了。有兴趣的小伙伴可以用更多的数据来测试,这里我就不展开了。

接下来,在验证码背景添加噪点来看看:

c = Claptcha("8069","/usr/share/fonts/truetype/freefont/FreeMono.ttf",noise=0.4)t,_ = c.write('2.png')

生成验证码如下:


识别:

p2 = Image.open('2.png')tesserocr.image_to_text(p2)'8069/n/n'

效果还可以。接下来生成一个字母数字组合的:

c2 = Claptcha("A4oO0zZ2","/usr/share/fonts/truetype/freefont/FreeMono.ttf")t,_ = c2.write('3.png')

生成验证码如下:

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表