pytesseract提取识别图片中的文字

原文链接:http://www.juzicode.com/image-ocr-pytesseract

pytesseract是对Tesseract-OCR命令行的封装,实际上底层调用的还是tesseract可执行文件,所以在使用pytesseract前需要完成Tesseract-OCR软件安装和语言包安装,详细方法可以参考 Tesseract-OCR5.0软件安装和语言包安装(Windows系统)

pytesseract可以通过pip安装,当前(2021.11)最新版本为0.3.8:

pip install pytesseract

1、获取tesseract版本号

get_tesseract_version()获取tesseract的版本号,注意并不是pytesseract的版本号:

#juzicode.com / VX公众号:桔子code  
import pytesseract as ts
version = ts.get_tesseract_version()
print('version:',version)

运行结果:

version: 5.0.0-rc1.20211030

结果和在命令行执行”tesseract –version”看到的版本号是一样的:

E:\juzicode\tess>tesseract --version
tesseract v5.0.0-rc1.20211030

2、获取语言包列表

通过get_languages()获取安装的语言包列表:

#juzicode.com / VX公众号:桔子code  
import pytesseract as ts
langs = ts.get_languages()
print('langs:',langs)

运行结果:

langs: ['chi_sim', 'eng', 'osd']

和在命令行用“tesseract –list-langs”检查语言包得到的结果是一样的:

E:\juzicode\tess>tesseract --list-langs
List of available languages (3):
chi_sim
eng
osd

3、识别图片中的文字

image_to_string()用来识别图片中的文字,最简单的用法传入2个入参,一个是图片的文件名称,一个是识别所用的语言包类型,比如要识别下图中的文字,这是一段从pdf文件中截屏的片段,文件名为bookseg.png,语言包选择chi_sim:

img_fn = 'bookseg.png'
lang = 'chi_sim'
text = ts.image_to_string(img_fn,lang)
print(text)

运行结果:

引 言

数 字 图 像 处 理 方 法 的 重 要 性 源 于 两 个 主 要 应 用 领 域 : 改 善 图 示 信 息 以 便 人 们 解 释 ; 为 存 储 、 传
输 和 表 示 而 对 图 像 数 据 进 行 处 理 , 以 便 于 机 器 自 动 理 解 。 本 章 有 几 个 主 要 目 的 : (1) 定 义 我 们 称 之 为
图 像 处 理 领 域 的 范 围 ; (2) 从 历 史 观 点 回 顾 图 像 处 理 的 起 源 ; (3) 通 过 考 察 一 些 主 要 的 应 用 领 域 , 给 出

图 像 处 理 技 术 状 况 的 概 念 ; (4) 筒 要 讨 论 数 字 图 像 处 理 中 所 用 的 主 要 方 法 ; (5) 概 述 通 用 目 的 的 典 型 图
像 处 理 系 统 的 组 成 ; (6) 列 出 公 开 发 表 的 数 字 图 像 处 理 领 域 的 一 些 图 书 和 文 献 。

从这个例子可以看到识别清晰度较高的图片效果还是非常好的。

除了前面介绍的传入图片文件名称的方法,还可以传入图像的numpy数组,这样就可以和pillow、opencv等模块配合使用,在某些场合下就可以先用pillow或opencv等做一些预处理再传入到image_to_string()中识别。

img_fn = 'bookseg.png'
lang = 'chi_sim'
img = cv2.imread(img_fn,0)
cv2.imwrite('gray-bin.jpg',img)
text = ts.image_to_string(img,lang) #第1个参数传入numpy类型
print(text)

image_to_string()还可以用config参数配置tesseract的命令选项,所有的可选参数组成一个字符串传给config入参,使用方法为:

text = ts.image_to_string(img,lang,config='--psm 6 --oem 1 --loglevel ALL')

详细的参数选项有如下几种,可以通过tesseract的help命令查询到:

OCR options:
  --tessdata-dir PATH   Specify the location of tessdata path.
  --user-words PATH     Specify the location of user words file.
  --user-patterns PATH  Specify the location of user patterns file.
  --dpi VALUE           Specify DPI for input image.
  --loglevel LEVEL      Specify logging level. LEVEL can be
                        ALL, TRACE, DEBUG, INFO, WARN, ERROR, FATAL or OFF.
  -l LANG[+LANG]        Specify language(s) used for OCR.
  -c VAR=VALUE          Set value for config variables.
                        Multiple -c arguments are allowed.
  --psm NUM             Specify page segmentation mode.
  --oem NUM             Specify OCR Engine mode.
NOTE: These options must occur before any configfile.

4、获取图片中文字的详细信息

image_to_data()用来获取识别出来的文字的详细信息,包含识别到的文本内容,可信度,位置等:

img_fn = 'bookseg.png'
lang = 'chi_sim'
data = ts.image_to_data(img_fn,lang)
print(data)

运行结果:

最后一列是识别出来的文本内容,往前一列是识别出来的可信度,再往前4列是在图片中的位置,包含left,top,width,height等4个要素。

注意image_to_data()返回的是str类型的数据,如果要使用其中的conf可信度,left,top等位置信息,还需要经过提取、转换才能得到。

5、识别图片中的文字和位置

image_to_boxes()用来获取识别出来的文字和位置信息:

img_fn = 'bookseg.png'
lang = 'chi_sim'
boxes = ts.image_to_boxes(img_fn,lang)
print(boxes)

运行结果:

这种方法得到的位置信息和image_to_data()中得到的left,top,width,height位置信息是一样的。同样image_to_data()返回的结果也是一个字符串,如果要使用其中的单个字符和位置信息,也需要进行提取和转换。

6、识别osd信息

image_to_osd()返回识别到的osd信息:

img_fn = 'bookseg.png'
lang = 'chi_sim'
osd = ts.image_to_osd(img_fn,lang)
print(osd)
print(type(osd))

运行结果:

Page number: 0
Orientation in degrees: 0
Rotate: 0
Orientation confidence: 37.74
Script: Han
Script confidence: 1.43

<class 'str'>

7、识别并生成xml文件

image_to_pdf_or_hocr()可以将识别的文字信息转为xml格式字节流,从而可以写入到xml文件中,其中入参extension设置为’hocr’:

img_fn = 'bookseg.png'
lang = 'chi_sim'    
hocr = ts.image_to_pdf_or_hocr(img_fn, lang, extension='hocr')
with open('test.xml', 'w+b') as f:
    f.write(hocr)  
print(type(hocr))

调用image_to_pdf_or_hocr()返回的数据类型为bytes类型,这点和前面几种方法的返回结果是有差异的,bytes类型可以用wb方式写入到文件,写入完成后打开文件可以看该文件包含了识别文字、可信度、位置信息等内容:

避坑指南:

1、提示tesseract未安装错误:

import pytesseract as ts
version = ts.get_tesseract_version()
print('version:',version)

======运行结果
FileNotFoundError: [WinError 2] 系统找不到指定的文件。
......
pytesseract.pytesseract.TesseractNotFoundError: tesseract is not installed or it's not in your PATH. See README file for more information.

原因:一个是没有安装tesseract命令行工具,一个是安装完后没有把安装路径添加到PATH系统变量中。

2、获取不到支持的语言包:

img_fn = 'bookseg.png'
lang = 'chi_sim'
text = ts.image_to_string(img_fn,lang,config='--tessdata-dir d:\\dev\\Tesseract-OCR5.0.0\\tessdata')
print(text)

======运行结果
pytesseract.pytesseract.TesseractError: (1, 'Error opening data file d:devTesseract-OCR5.0.0tessdata/chi_sim.traineddata Please make sure the TESSDATA_PREFIX environment variable is set to your "tessdata" directory. Failed loading language \'chi_sim\' Tesseract couldn\'t load any languages! Could not initialize tesseract.')

使用config参数指定语言包路径时,不能使用右斜杠,只能使用左斜杠。

#text = ts.image_to_string(img_fn,lang,config='--tessdata-dir d:\\dev\\Tesseract-OCR5.0.0\\tessdata')
text = ts.image_to_string(img_fn,lang,config='--tessdata-dir d:/dev/Tesseract-OCR5.0.0/tessdata')

3、使用–oem 0选项时提示不支持老版本的ocr引擎,需要切换为–oem 1或者不指明oem默认使用新的ocr引擎:


img_fn = 'bookseg.png'
lang = 'eng'
text = ts.image_to_string(img_fn,lang,config='--oem 0')

======运行结果
pytesseract.pytesseract.TesseractError: (1, "Error: Tesseract (legacy) engine requested, 
but components are not present in d:\\dev\\Tesseract-OCR5.0.0/tessdata/eng.traineddata!! 
Failed loading language 'eng' Tesseract couldn't load any languages! Could not initialize tesseract.")

扩展阅读:

  1. Tesseract-OCR5.0软件安装和语言包安装(Windows系统)
  2. 提高识别精度的方法:https://tesseract-ocr.github.io/tessdoc/ImproveQuality.html

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注