Python使用Tesseract-OCR识别验证码

工作中会涉及一些使用图形验证码的场景,导致自动化测试无法进行,于是简单研究了一下验证码的识别技术。
简单Google之后,发现了Tesseract-OCR:
Tesseract是一个开源的OCR(Optical Character Recognition,光学字符识别)引擎,可以识别多种格式的图像文件并将其转换成文本,目前已支持60多种语言(包括中文)。 Tesseract最初由HP公司开发,后来由Google维护,github地址: https://github.com/tesseract-ocr/tesseract

安装

本人使用的是Windows 10 64bits系统

  1. 安装tesseract-OCR
    参考官方wiki,windows系统只有非官方的安装包
  2. pytesseract安装
    pip install pytesseract
  3. 安装PIL
    Windows 64bits下PIL的安装,请参考另一篇博客

#验证码识别代码 #

基本操作

1
2
3
4
5
6
import pytesseract
from PIL import Image
image = Image.open('code.png')
code = pytesseract.image_to_string(image)
print code

优化

上面是使用tesseract-OCR进行图像识别的基本方法,但在实际情况中,验证码里往往有一些干扰信息等,需要做一些特殊处理才能识别,否则错误率很高。
搜索的一下,大致的处理方法如下:

  1. 灰度化及二值化

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #转成灰度图
    imgry = image.convert('L')
    #二值化,阈值可以根据情况修改
    threshold = 128
    table = []
    for i in range(256):
    if i < threshold:
    table.append(0)
    else:
    table.append(1)
    out = imgry.point(table, '1')
    return out
  2. 降噪
    对于去除噪音的技术,没有一个统一的算法,但是一个网站的验证码噪音,一定是有一定的规则的。比如有的是一些孤立点、有的是一些直线等等。只有分析出这个规则,就可以写相应的代码去除干扰。
    其他还看到一些Flood fill、腐蚀、膨胀等图像处理算法,这里没有做深入研究。

训练

对于简单一点的验证码,经过上述步骤,应该已经可以正确识别了。但如果准确率还比较低的话,就需要通过对应的训练工具和训练样本,来提高识别率了。
Tesseract-OCR的训练过程大致如下:
安装jTessBoxEditor -> 获取样本文件 -> Merge样本文件 –> 生成BOX文件 -> 定义字符配置文件 -> 字符矫正 -> 执行批处理文件 -> 将生成的traineddata放入tessdata中
经过训练之后,应该可以大大提高验证码的识别率。

原理分析

出于好奇,简单了解了一下识别原理,详细内容可参考这篇文章
识别过程大致可以分为两步:1.划分包含文字的区域;2.对文件进行识别。
其中每一步都有复杂的算法逻辑。第一步涉及预处理(倾斜校正 去噪等)、版面分析、字符切分等,第二部涉及特征提取、分类、后处理。

欢迎打赏!