序
工作中会涉及一些使用图形验证码的场景,导致自动化测试无法进行,于是简单研究了一下验证码的识别技术。
简单Google之后,发现了Tesseract-OCR:
Tesseract是一个开源的OCR(Optical Character Recognition,光学字符识别)引擎,可以识别多种格式的图像文件并将其转换成文本,目前已支持60多种语言(包括中文)。 Tesseract最初由HP公司开发,后来由Google维护,github地址: https://github.com/tesseract-ocr/tesseract
安装
本人使用的是Windows 10 64bits系统
- 安装tesseract-OCR
参考官方wiki,windows系统只有非官方的安装包 - pytesseract安装
pip install pytesseract - 安装PIL
Windows 64bits下PIL的安装,请参考另一篇博客
#验证码识别代码 #
基本操作
|
|
优化
上面是使用tesseract-OCR进行图像识别的基本方法,但在实际情况中,验证码里往往有一些干扰信息等,需要做一些特殊处理才能识别,否则错误率很高。
搜索的一下,大致的处理方法如下:
灰度化及二值化
123456789101112#转成灰度图imgry = image.convert('L')#二值化,阈值可以根据情况修改threshold = 128table = []for i in range(256):if i < threshold:table.append(0)else:table.append(1)out = imgry.point(table, '1')return out降噪
对于去除噪音的技术,没有一个统一的算法,但是一个网站的验证码噪音,一定是有一定的规则的。比如有的是一些孤立点、有的是一些直线等等。只有分析出这个规则,就可以写相应的代码去除干扰。
其他还看到一些Flood fill、腐蚀、膨胀等图像处理算法,这里没有做深入研究。
训练
对于简单一点的验证码,经过上述步骤,应该已经可以正确识别了。但如果准确率还比较低的话,就需要通过对应的训练工具和训练样本,来提高识别率了。
Tesseract-OCR的训练过程大致如下:
安装jTessBoxEditor -> 获取样本文件 -> Merge样本文件 –> 生成BOX文件 -> 定义字符配置文件 -> 字符矫正 -> 执行批处理文件 -> 将生成的traineddata放入tessdata中
经过训练之后,应该可以大大提高验证码的识别率。
原理分析
出于好奇,简单了解了一下识别原理,详细内容可参考这篇文章。
识别过程大致可以分为两步:1.划分包含文字的区域;2.对文件进行识别。
其中每一步都有复杂的算法逻辑。第一步涉及预处理(倾斜校正 去噪等)、版面分析、字符切分等,第二部涉及特征提取、分类、后处理。