识别图片中的文字并不是很困难。如果自己训练一个文字识别的深度学习程序去识别也是可以,但是太费劲。
Tesseract-OCR是一个开源的文字识别引擎,并且支持包括中文在内的多国语言。只要将语言配置上去,就可以识别对应的语言。
如果是印刷字体,识别是没有问题的,几乎是100%准确识别,一般用于识别印刷体的话是不需要再另外训练的,如果要识别手写体就需要额外的训练,这部分以后有时间再研究。
下面是项目下载地址:
源文件地址:/tesseract-ocr/tesseract
安装文件地址:/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"<<path<<hocrPathWithoutSuffix<<"hocr";
这样会生成“.hocr”文件,识别效果基本上还是可以的,考虑到这里面会有box信息以及置信度,尽管解析这个html比较困难,还是做了。但是发现个位数的数字识别不到,可能是块太小?
我在做字库训练的时候,发现也是个位数的数字识别不到,在网上找到了解决方案,添加“--psm 6”参数就解决了,相当于是碎块识别吧,他不会把没有粘连的字识别为整体,而识别为不同个体。这样数字的话他也不会识别为一个整体数字,而是其中每个数字分别识别。
但是此参数添加进上述命令行参数中没有效果,可能是因为hocr格式限制。尝试用不同方法,比如txt,确实是可以识别了,但是没有box信息,无法进一步判断是有效页码还是污点。
因为他这个识别没有提供置信度,也没有提供设置置信度高于多少才识别出来的方法(阈值),而是每个污点他都会识别为数字(字库里只有数字,如果用eng或者其他的综合字库则识别效果也不好,数字都识别不好。)
所以用box来判断文字的大小方位进一步确定是否有效识别是很重要的。
如下:
list<<"-l"<<"Digital1"<<"--psm"<<"6"<<path<<hocrPathWithoutSuffix<<"makebox";
解决了页码识别的问题。
4、页码字库训练
①下载地址在这里:
/projects/vietocr/files/jTessBoxEditor/
下载对应tesseract版本的训练器。下载之后有version文件,可以看对应的版本。
②把所有字库tif图片合并为一个多页tif
合并方法是:
选择之后马上弹窗让你填写保存的文件名称,这个交互效果不太好,以为是没选好,其实选完了。
③生成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】,进行编辑:
这是进行一个校正。做好之后保存,会保存为新的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
这样就生成字库了。参考了这篇文字,在此致谢:
/qq_40147863/article/details/82290015