pytesseract image_to_data检测并定位图片中的文字

pytesseract是用python包装Google Tesseract-OCR引擎的OCR工具,它通过调用系统中安装的tesseract.exe来识别图片中的文字并以多种格式进行输出。本文将记录如何使用pytesseract中image_to_data定位图片中的文字,以及该函数输出数据的格式详解。

pytesseract image_to_data locate text

环境说明

python3.6 + Tesseract4.0 + win10

Tesseract安装

pytesseract要求使用电脑中已安装Tesseract,使用Github下载的Tesseract安装版本,或者自行编译的Tesseract源码编译版本都可以。网络上有很多关于Tesseract安装版本的教程,这里就不再多说;若需要源码编译版本,可以参考Tesseract4.0+VS2017+win10源码编译攻略,参考链接中有Tesseract4.1源码编译版本的CSDN和google drive的下载链接。
安装完成后,需要告知pytesseract tesseract.exe执行档以及tessdata的所在的路径,通常有两种方式:
1. python代码来设置tesseract.exe和tessdata的所在路径,如下代码所示:
2. 设置tesseract相关的环境变量,设置后可以“一劳永逸”,用到tesseract的python代码均不需要再通过代码设置路径,设置步骤如下:
2.1. 打开环境变量—->系统变量中选择[Path]—>添加本机中tesseract.exe所在路径,例如[C:\Program Files\tesseract\bin]。
2.2. 打开环境变量—->选择[新建]—>在跳出的窗口中,[变量名]设置为[TESSDATA_PREFIX],变量值设置为本机中tesseract\tessdata所在路径,例如[C:\Program Files\tesseract\tessdata]。

Tesseract TSV格式的输出 

pytesseract的介绍中,函数image_to_data返回识别结果中包含框边界,置信度和其他信息的结果。若需要得到更详细的信息,需要参考Tesseract TSV documentation

为了得到更详细的信息,我们先使用tesseract在命令行中得到图像的tsv识别文件。

test image of image_to_data

打开command.exe,切换至Think.png所在路径,输入以下命令并按下回车键:

注意这里的”Warning”,本文所使用的测试图像出现了“Warning: Invalid resolution 0 dpi. Using 70 instead.”的警告。这是Tesseract中非常常见的一个警告,相关讨论可以额参考这里Warning. Invalid resolution 0 dpi. Using 70 instead. 在上述链接中提及该问题点在Tesseract4.0及以上版本已有解决方案:在命令行后添加–dpi 300即可,在pytesseract或在C++中使用Tesseract时,均可以使用该设定。

运行完成后,在Think.png统一路径下会生成一个名为Think.tsv的文件。

有兴趣的同学可以测试一下本文使用的测试图片,会发现是否设定[–dpi 300]的输出结果是有差异的。加上该设定后,Tesseract识别出的文字为[Think different],若不加此设定,除了[Think different]之外,Tesseract还识别出一个字母[g]。后面在代码部分会说明在python代码中如何设定[–dpi 300]。

为了后面对比不同字符的置信度,本文均使用无[–dpi 300]设定的输出结果,其内容如下:

level = 1/2/3/4/5,用于标注当前项的层级。
page_num, level = 1;用于标注当前项所属页面。一般情况下,单张图片的内容均会被分在同一个页,且在tsv文件中只有第一行的level为1,当level=1时,left=0, top=0, width和height分别是图片的实际宽度和高度。
block_num, level = 2; Tesseract会将图像分割为多个不同的block,block会出现1,2,3……等等值
par_num, level = 3; 从Tessract的相关文档来看,该参数应该是当前图像中文字的段落分类,level=1/2/3时,该值为0;其他情况为1。
line_num, level = 4; 一般均为1。
word_num, level = 5;在同一行[line_num]中出现的单词序号。
left/top/width/height:当前项所在长方形区域的左上角,宽度,高度。
conf,当前检测字符的置信度,表示项无文字,值为-1;若Tesseract认为当前区域有文字,则其值得范围为0~100。

image_to_data

接下来我们来看pytesseract中image_to_data中的应用。

第1~6行代码导入必要的程序库。
第8-9行读取与当前py文件相同路径的示例图像,并获取图像的高和宽。
第13行对opencv读取的图像进行转换。因opencv读取图像的默认格式为BGR,但Tesseract需要RGB的彩色图像,因此这里需要进行转换。
第15行调用pytesseract的image_to_data()函数获取识别结果,输出格式为”Output.DICT”,这样可以完整的输出tesseract输出文件tsv的内容。
第16行打印results的输出内容,对照results的输出与tesseract的tsv输出,有助于我们更好理解其输出内容,如下所示:

第18~30行遍历results中的元素,当results[“level”]=5时,当前项次为Tesseract检测后认为有效单词的项,获取当前单词的外界矩形与识别结果,并绘制在测试图像中。

第32-33行将标注过的图像显示出来。

从图示结果中,我们可以看到Tesseract将苹果上的小叶片识别为字母”g”,查看其对应的conf为14,而另外两个单词”Think”和”different”的conf则均为96。因此我们在实际应用中,可以通过设置conf的值来对识别结果进行筛选。

假如输入图像的分辨率较低,可以考虑在代码中添加[–dpi 300]的设定,如下:

总结

本文详细介绍了pytesseract中image_to_data函数,参考本文可以实现pytesseract/image_to_data的一些基本应用,但要想更好的应用tesseract,还有很多细节和宝藏函数值得我们去学习和挖掘。
本文到此结束,感谢阅读,欢迎关注。

发表回复

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

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

Fork me on GitHub