如何使用Tesseract OCR提高文本识别能力?

4

我在IOS中实现了Tesseract OCR进行文本识别。我预处理了输入图像并将其送入Tesseract方法中,但结果很差。

步骤:

1.腐蚀函数

2.膨胀函数

3.按位非函数

 Mat MCRregion;
 cv::dilate ( MCRregion, MCRregion, 24);
 cv::erode ( MCRregion, MCRregion, 24);
 cv::bitwise_not(MCRregion, MCRregion);

 UIImage * croppedMCRregion = [self UIImageFromCVMat:MCRregion];

    Tesseract* tesseract = [[Tesseract alloc] initWithDataPath:@"tessdata" language:@"eng"];
    [tesseract setVariableValue:@"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz.>,'`;-:</" forKey:@"tessedit_char_whitelist"];
    [tesseract setImage:[self UIImageFromCVMat:MCRregion]];
    //                [tesseract setImage:image];
    [tesseract recognize];

    NSLog(@"%@", [tesseract recognizedText]);

输入图像:

图像链接

1.如何使用Tesseract提高文本识别率?

2.Tesseract中是否还应用了其他预处理步骤?

3.Tesseract OCR是否完成了文本去曲变?


你的训练数据集是什么?你是否通过多张相同类型的图像来训练模型? - Y.AL
我使用了Tesseract的训练数据,并在Tesseract中的“setVariableValue”中提到了一些字母。 - balajichinna
我建议您查看我的答案,网址为https://dev59.com/uWw15IYBdhLWcg3wQpbS#21050336。 - Y.AL
实际上,您需要使用您已有的数据进行重新训练以进行识别。正如我在回答中提到的那样,要裁剪您的实际字符,您需要使用 jTessBoxEditor 工具。 - Y.AL
3个回答

10

Tesseract是一款高度可配置的软件,但其配置文档不够详细(除非您想深入研究150K行代码)。这里有一个很好的全面列表http://www.sk-spell.sk.cx/tesseract-ocr-parameters-in-302-version

此外,请参阅https://code.google.com/p/tesseract-ocr/wiki/ControlParamshttps://code.google.com/p/tesseract-ocr/wiki/ImproveQuality

如果提供有关正在OCR的数据的更多信息,可以大幅提高质量。 例如,如果图像都是遵循某些标准MRZ格式的国民身份证或护照,则可以配置tesseract使用该信息。

对于您所附的图像(MRZ),我得到了以下结果:

IDFRADOUEL<<<<<<<<<<<<<<<<<<<<9320 
05O693202O438CHRISTIANE<<N1Z90620<3

通过使用以下配置

# disable dict, freq tables etc which would distract OCR'ing an MRZ
load_system_dawg F
load_freq_dawg F
load_unambig_dawg F
load_punc_dawg F
load_number_dawg F
load_fixed_length_dawgs F
load_bigram_dawg F
wordrec_enable_assoc F

# mrz allows only these chars
tessedit_char_whitelist 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ<

同时请确保您的安装已经针对字体进行了训练,以获得更准确的结果。在您的情况下,似乎是OCR-B字体。


5
不必费时地重新训练Tesseract,但是有时候使用ENG训练集就可以获得相当不错的结果。
以下几点可以帮助你提高识别率:
1. 使用二值图像作为输入,并确保黑色文字在白色背景上。 2. Tesseract默认会将没有间隔的字符组合成单词。尝试将每个字符分开并在新图片中放置,注意给字符留出充足的间距。特别是在字母和数字的组合中,Tesseract会"纠正"这些字符以匹配周围的字符。 3. 尝试使用白名单来标记图片中应该识别的不同部分。例如,在第一部分中只需要识别数字,则可以使用仅包含数字的白名单来创建Tesseract的新实例。 4. 如果您在不重置对象的情况下多次使用相同的对象,则Tesseract似乎会存储之前的结果。这意味着每次执行OCR都可能得到不同的结果。您可以重置Tesseract以解决此问题或创建一个新对象。 5. 最后,使用resultIterator浏览Tesseract返回的框,检查每个字符的大小和置信度,并据此进行过滤。

2

根据我的经验:

1.如何使用Tesseract提高文本识别率?

  • 首先,进行预处理。确保输入图像是二值图像,并具有良好的阈值。 OpenCV具有一组良好的函数来应用阈值算法,例如Otsu算法以及轮廓检测,以帮助进行扭曲和旋转。

  • 您还可以在OpenCV中使用轮廓检测来区分文本行。

  • 一些过滤也会消除噪声,这常常会使tesseract混淆并增加处理时间。

  • 为tesseract设置适当的配置(例如eng.config)。配置的完整列表在此处(http://www.sk-spell.sk.cx/tesseract-ocr-parameters-in-302-version)。一些示例包括黑名单、白名单、切割等...

  • 使用适当的标志。例如,如果您正在处理文本块而不是行,则使用-psm 6

  • 如果你有足够的时间和资源,或者你的字体非常特殊(例如点矩阵),那么可以训练自己的语言数据。否则不建议这样做。

  • 更近期的Tesseract版本(接近3.0)允许在同一次识别中使用多个语言文件(-l one+two)。这意味着您可以为文本和数字分别进行专门的培训。在我们的情况下,它似乎很有效。

  • tesseract结果的后处理对我们来说尤其重要。例如,字符串替换常见的错误识别等。

2.Tesseract中是否应用了其他预处理步骤?

Tesseract使用leptonica库进行预处理。

3.Tesseract OCR中是否进行了文本去畸变?

我倾向于认为是的。考虑到扭曲函数是leptonica的一部分。


  1. Tesseract默认会应用其他预处理步骤吗?
  2. Tesseract OCR默认会进行文本去畸变处理吗?我编辑了我的问题,请回答问题。
- balajichinna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接