使用Tesseract-OCR识别图片中的文字并生成双层PDF

识别图片中的文字并不是很困难。如果自己训练一个文字识别的深度学习程序去识别也是可以,但是太费劲。

Tesseract-OCR是一个开源的文字识别引擎,并且支持包括中文在内的多国语言。只要将语言配置上去,就可以识别对应的语言。

如果是印刷字体,识别是没有问题的,几乎是100%准确识别,一般用于识别印刷体的话是不需要再另外训练的,如果要识别手写体就需要额外的训练,这部分以后有时间再研究。

下面是项目下载地址:

源文件地址:https://github.com/tesseract-ocr/tesseract

安装文件地址:https://github.com/UB-Mannheim/tesseract/wiki

1、安装Tesseract-OCR

我们先安装测试Tesseract-OCR,看看到底是怎么使用的。

>语言包:首先下载下来,双击安装,安装过程中注意选择语言包,要勾选chinese-simple;

>配置环境变量:安装完成之后,会生成文件夹:C:\Program Files (x86)\Tesseract-OCR,将此路径添加到环境变量;

2、使用

ouput_5是文件名,如果后面有pdf则生成双层pdf,如果后面没有则生成txt。

3、页码识别

页码识别时整个页面输入识别效果不好。最好是切四个角保存成图片然后分别识别,选取有识别出来的页码。

在做页码识别的时候一开始让他生成hocr格式的,参数如下:

list<<"-l"<<"Digital1"<

这样会生成“.hocr”文件,识别效果基本上还是可以的,考虑到这里面会有box信息以及置信度,尽管解析这个html比较困难,还是做了。但是发现个位数的数字识别不到,可能是块太小?

我在做字库训练的时候,发现也是个位数的数字识别不到,在网上找到了解决方案,添加“--psm 6”参数就解决了,相当于是碎块识别吧,他不会把没有粘连的字识别为整体,而识别为不同个体。这样数字的话他也不会识别为一个整体数字,而是其中每个数字分别识别。

但是此参数添加进上述命令行参数中没有效果,可能是因为hocr格式限制。尝试用不同方法,比如txt,确实是可以识别了,但是没有box信息,无法进一步判断是有效页码还是污点。

因为他这个识别没有提供置信度,也没有提供设置置信度高于多少才识别出来的方法(阈值),而是每个污点他都会识别为数字(字库里只有数字,如果用eng或者其他的综合字库则识别效果也不好,数字都识别不好。)

所以用box来判断文字的大小方位进一步确定是否有效识别是很重要的。

如下:

list<<"-l"<<"Digital1"<<"--psm"<<"6"<

解决了页码识别的问题。

4、页码字库训练

①下载地址在这里:

https://sourceforge.net/projects/vietocr/files/jTessBoxEditor/

下载对应tesseract版本的训练器。下载之后有version文件,可以看对应的版本。

②把所有字库tif图片合并为一个多页tif

使用Tesseract-OCR识别图片中的文字并生成双层PDF_第1张图片

合并方法是:

使用Tesseract-OCR识别图片中的文字并生成双层PDF_第2张图片

选择之后马上弹窗让你填写保存的文件名称,这个交互效果不太好,以为是没选好,其实选完了。

③生成box文件,用命令行:

tesseract num.font.exp0.tif num.font.exp0 batch.nochop makebox

注意,因为我们识别不了单个的数字,因此要加个参数在这里:

tesseract num.font.exp0.tif num.font.exp0 --psm 6 batch.nochop makebox

加了个psm参数,不然在进行编辑校正的时候单个的数字无法识别到!

④新建一个文本文件,名为font_properties

内容为:

font 0 0 0 0 0

⑤打开软件【BOX Editor】> 【Open】,进行编辑:

使用Tesseract-OCR识别图片中的文字并生成双层PDF_第3张图片

这是进行一个校正。做好之后保存,会保存为新的box。

⑥执行生成

在本目录下创建一个文本文件do.bat,内容如下:

echo Run Tesseract for Training.. 
tesseract.exe num.font.exp0.tif num.font.exp0 nobatch box.train 

echo Compute the Character Set.. 
unicharset_extractor.exe num.font.exp0.box 
mftraining -F font_properties -U unicharset -O num.unicharset num.font.exp0.tr 


echo Clustering.. 
cntraining.exe num.font.exp0.tr 

echo Rename Files.. 
rename normproto num.normproto 
rename inttemp num.inttemp 
rename pffmtable num.pffmtable 
rename shapetable num.shapetable  

echo Create Tessdata.. 
combine_tessdata.exe num. 

echo. & pause

这样就生成字库了。参考了这篇文字,在此致谢:

https://blog.csdn.net/qq_40147863/article/details/82290015

 

你可能感兴趣的:(OCR)