Tesseract是一个开源的OCR(Optical Character Recognition,光学字符识别)引擎,能够识别多种格式的图像文件并将其转换成文本。眼下已支持60多种语言(包含中文)。 Tesseract最初由HP公司开发,后来由Google维护,眼下公布在Googel Project上。
地址为http://code.google.com/p/tesseract-ocr/。
使用默认的语言库识别
1.安装Tesseract
从http://code.google.com/p/tesseract-ocr/downloads/list下载Tesseract,眼下版本号为Tesseract3.02。由于仅仅是測试使用,这里直接下载winodws下的安装文件tesseract-ocr-setup-3.02.02.exe。成功安装后会在对应磁盘上生成一个Tesseract-OCR文件夹。通过文件夹下的tesseract.exe程序就能够对图像字符进行识别了。
2.准备一副待识别的图像,这里用绘图工具随便写了一串数字。保存为number.jpg,例如以下图所看到的:
3. 打开命令行,定位到Tesseract-OCR文件夹,输入命令:
- tesseract.exe number.jpg result -l eng
tesseract.exe number.jpg result -l eng
当中result表示输出结果文件txt名称,eng表示用以识别的语言文件为英文。
3. 打开Tesseract-OCR文件夹下的result.txt文件。看到识别的结果为7542315857,有3个字符识别错误。识别率还不是非常高,那有没有什么方法来提供识别率呢?Tesseract提供了一套训练样本的方法,用以生成自己所需的识别语言库。以下介绍一下详细训练样本的方法。
训练样本
关于怎样训练样本。Tesseract-OCR官网有具体的介绍http://code.google.com/p/tesseract-ocr/wiki/TrainingTesseract3。这里通过一个简单的样例来介绍一下怎样进行样本训练。
1.下载工具jTessBoxEditor. http://sourceforge.net/projects/vietocr/files/jTessBoxEditor/,这个工具是用来训练样本用的。因为该工具是用JAVA开发的,须要安装JAVA虚拟机才干执行。
2. 获取样本图像。用绘图工具绘制了5张0-9的文样本图像(当然样本越多越好)。例如以下图所看到的:
3.合并样本图像。
执行jTessBoxEditor工具。在点击菜单条中Tools--->Merge TIFF。在弹出的对话框中选择样本图像(按Shift选择多张),合并成num.font.exp0.tif文件。
4.生成Box File文件。打开命令行,运行命令:
- tesseract.exe num.font.exp0.tif num.font.exp0 batch.nochop makebox
tesseract.exe num.font.exp0.tif num.font.exp0 batch.nochop makebox
生成的BOX文件为num.font.exp0.box,BOX文件为Tessercat识别出的文字和其坐标。
注:Make Box File的命令格式为:
- tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] batch.nochop makebox
tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] batch.nochop makebox
当中lang为语言名称,fontname为字体名称,num为序号,能够随便定义。
5.文字校正。执行jTessBoxEditor工具,打开num.font.exp0.tif文件(必须将上一步生成的.box和.tif样本文件放在同一文件夹)。例如以下图所看到的。能够看出有些字符识别的不对,能够通过该工具手动对每张图片中识别错误的字符进行校正。
校正完毕后保存就可以。
6.定义字体特征文件。Tesseract-OCR3.01以上的版本号在训练之前须要创建一个名称为font_properties的字体特征文件。
font_properties不含有BOM头,文件内容格式例如以下:
- <fontname> <italic> <bold> <fixed> <serif> <fraktur>
<fontname> <italic> <bold> <fixed> <serif> <fraktur>
当中fontname为字体名称。必须与[lang].[fontname].exp[num].box中的名称保持一致。<italic> 、<bold> 、<fixed> 、<serif>、 <fraktur>的取值为1或0。表示字体是否具有这些属性。
这里在样本图片所在文件夹下创建一个名称为font_properties的文件。用记事本打开,输入下面下内容:
- font 0 0 0 0 0
font 0 0 0 0 0
这里全取值为0。表示字体不是粗体、斜体等等。
7.生成语言文件。
在样本图片所在文件夹下创建一个批处理文件,输入例如以下内容。
- rem 运行改批处理前先要文件夹下创建font_properties文件
- 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.
rem 运行改批处理前先要文件夹下创建font_properties文件
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.
将批处理通过命令行运行。运行后的结果例如以下:
需确认打印结果中的Offset 1、3、4、5、13这些项不是-1。这样,一个新的语言文件就生成了。
num.traineddata便是终于生成的语言文件。将生成的num.traineddata复制到Tesseract-OCR-->tessdata文件夹下。
能够用它来进行字符识别了。
使用训练后的语言库识别
用训练后的语言库识别number.jpg文件。 打开命令行。定位到Tesseract-OCR文件夹,输入命令:
- tesseract.exe number.jpg result -l eng
tesseract.exe number.jpg result -l eng
识别结果如如图所看到的,能够看到识别率提高了不少。通过自己定义训练样本,能够进行图形验证码、车牌号码识别等。感兴趣的朋友能够研究研究。