利用Tesseract OCR引擎识别验证码

最近研究了一下验证码识别的技术,基本上都是在做图像的识别,具体一点来说就是文字的识别。比较流行的就是使用Google的Tesseract OCR引擎来做支撑,识别图像中的文字。本文主要讲解如何利用Tesseract OCR识别最简单的验证码和文章内容。

安装Tesseract OCR引擎

关于Windows下如何安装Tesseract OCR引擎的文章实在是太多了,我就不赘述了,这里重点讲一下如何在macOS中安装Tesseract OCR引擎,答案是HomebrewMacPorts

Homebrew安装

使用Homebrew安装只需要运行以下代码即可:

1
brew install tesseract

MacPorts安装

使用MacPorts安装只需要运行一下代码即可:

1
sudo port install tesseract

安装PIL和Pytesseract

需要安装Python3的图像处理库和Tesseract包装类。

1
2
pip3 install Pillow
pip3 install pytesseract

安装完毕以后基本上就可以用来识别一些简单的图片验证码啦,还有一些比较清晰的文字。

简单验证码识别实例

我们以一些简单的图片为例演示一下如何使用Python3来识别验证码或图片文字。以下面的一个验证码为例:

7025.png

可以通过Pytersseract来识别:

1
2
3
4
5
6
7
8
9
import pytesseract
from PIL import Image

image = Image.open("data/7025.png")
image = image.convert("L")
image.load()
image.split()
image.save("data/gray_7025.png")
print(pytesseract.image_to_string(image))

结果如下:

1
2
3
7025

Process finished with exit code 0

另外在data目录下我们还可以看到一张二值化后的图片:

gray_7025

能够非常准确滴将这种简单的验证码识别出来。

标准文字图片实例

这一节我们以CNN网站上的新闻文字为例,截取了一张CNN的新闻文字图片,如下:

cnn-news

我们看一下它的识别效果如何?看一下运行结果:

1
2
3
4
5
6
7
8
9
10
11
The President‘s own lies and distortions, which are key
features of his leadership style, make it impossible for
anyone to rely on him and his aides in a normal way.

As a private citizen, Trump developed this squid—ink
method so that he could sell himself like a human
product. In falsely claiming that various starlets pursued
him for dates, or the British royals were eying Trump
real estate, he played a game with reality.

Process finished with exit code 0

基本上没有什么错误地识别出来了。

关于Tesseract OCR其它语言包以及复杂验证码问题

本文主要讨论的是如何利用Tesseract OCR引擎解决简单验证码和图片文字识别的问题。但是验证码可能会比较复杂,比如说加了干扰线等等。另外,Tesseract OCR用来识别中文会如何?这一些问题都是值得好好研究的。

Tesseract OCR其它语言包的问题

在这个页面下可以看到很全的语言包信息。https://github.com/tesseract-ocr/tesseract/wiki/Data-Files

大家可以下载对应的包去处理对应的文字信息。关于如何使用这些包,我以中文为例演示一下,首先在刚刚的网址下载一个中文的包,我们可以先看一下自己的tesseract-ocr版本是多少?

1
2
3
4
$ tesseract --version
tesseract 3.05.01
leptonica-1.74.4
libjpeg 9b : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11

所以,我们下载3.05版本的中文包,点我下载

把这个包加载到一个名叫lang的目录下,名字可以随便定,但是lang这个包要和我们的代码在同一个目录。一下面这幅图为例:

163-news

1
2
3
4
5
6
7
8
import pytesseract
from PIL import Image

image = Image.open("data/163-news-image.png")
image.load()
image.split()
tesseract_data_config = '--tessdata-dir "lang"'
print(pytesseract.image_to_string(image, lang="chi_sim", config=tesseract_data_config))

结果如下:

1
2
3
4
5
这是习近立总书记在新进口央委员会的委员` 候补委员和省部级三要领导二部学
>J贝彻刁近其新时代口玉特色社会二二义思想和党的十九大精神研讨班开班式上说的一
句=目一新` 息昧深长的话。

Process finished with exit code 0

可以看到中文的效果不是很理想,后面再进一步研究如何改进这种情况。

复杂验证码的问题

复杂验证码的情况比如字体变形了,或者是字体上加了很多干扰线,这种情况下仅仅tesseract-ocr是做不到的。需要前期做大量的预处理,比如去噪,二值化等等,这个也需要后面再进一步研究研究。面对更复杂的验证码就有可能需要使用机器学习的方式了。

总结

本文主要是介绍了如何使用Tesseract-OCR引擎并结合Python3来实现对简单验证码和普通文本的识别工作。目前这个引擎对英文的识别度非常理想,基本上可以用作商业用途了,而针对中文的识别效果则非常不理想,基本上不怎么可用,后面需要针对这个问题进一步研究,改进相关的模型和研究方法。

分享到