被一跳槽的hr同事忽悠到了一个奇葩公司,待了半个月实在待不下去了,于是决定裸辞,现在正赶上毕业季,面试的几个工作都过了,就是跟hr谈薪资的时候谈不拢,想起他们”现在职位少求职者多,我们发出去一个职位一天能收到三四十份简历“的嘴脸就觉得冤得慌,前有傻逼公司,后有傻逼hr,今年真是时运不济。最近赋闲在家,闲着没事研究下ocr文本识别。

安装pytesseract

pytesseract是google的开源文本识别库Tesseract-OCR的python绑定。Tesseract是一个开源的OCR(Optical Character Recognition,光学字符识别)引擎,可以识别多种格式的图像文件并将其转换成文本,目前已支持60多种语言(包括中文)。安装过程如下

安装tesseract-orc

brew update && brew install tesseract安装完成后可以直接在命令行中调用 tesseract imagefile outputfile [-l lang]进行识别,其中参数-l lang指定使用的语言包, imagefile是要识别的图片文件, outputfile.txt保存了识别的结果。例如
tesseract ~/Desktop/ocr-test.jpg result -l eng,识别的结果保存在文件result.txt中。
tesseract引擎默认只安装了英文语言包,如果需要识别其他语言需要安装相应的语言包,tesseract的语言包可以在tessdata项目中找到。我们以简体中文为例

  1. 下载chi_sim.traineddata
  2. 将下载的.traineddata文件移动到tesseract安装目录的tessdata文件夹下。
    如果不知道tessdata文件夹的位置,可以使用命令tesseract命令指定一个不存在的语言,错误信息中的Error opening datafile ...提到的就是语言包的保存目录。
    monk$ tesseract ~/Desktop/ocr-test.png result -l chi_sim
    1
    2
    3
    4
    5
    6
    7
    Tesseract Open Source OCR Engine v3.04.01 with Leptonica
    Error opening data file /usr/local/Cellar/tesseract/3.04.01_2/share/tessdata/chi_sim.traineddata

    Please make sure the TESSDATA_PREFIX environment variable is set to the parent directory of your "tessdata" directory.
    Failed loading language 'chi_sim'
    Tesseract couldn't load any languages!
    Could not initialize tesseract.

安装Pillow

pytesseract需要通过Pillow加载图片,在pytesseract 0.1.6包介绍中提到需要安装PIL

  • You will need the Python Imaging Library (PIL). Under Debian/Ubuntu, this is
    the package “python-imaging” or “python3-imaging” for python3.

但在Python package index中发现这个PIL项目太老了(November 15, 2009),所以肯定对python3不兼容。后来发现一个名为Pillow的Python Imaging Library (Fork),使用pip安装即可 pip install Pillow

安装pytesseract

使用pip安装pip install pytesseract

使用

pytesseract的识别过程可以概括为使用PIL加载图片->调用tesseract识别,如下是一个调用示例

1
2
3
4
5
6
7
8
from PIL import Image
import pytesseract as ocr
import urllib.request as urlreq
from io import BytesIO

resp = urlreq.urlopen('http://www.wisedream.net/res/img/ocr-test.png')
img = Image.open(BytesIO(resp.read()))
print(ocr.image_to_string(img, lang='chi_sim'))