提高Tesseract的检测质量

9
我正在尝试从使用消费级相机(包括手机)拍摄的图像中提取不构成有意义单词的字母数字字符(a-z0-9)。这些字符具有相同大小和字体类型,且未经格式化。实际处理是在Windows下完成的。
下面的图像显示原始输入: Original image 透视处理后,我使用OpenCV应用以下步骤:
- 将RGB转换为灰度 - 应用cv::medianBlur去除噪声 - 使用自适应阈值二值化图像cv::adaptiveThreshold - 我知道网格的行数和列数。因此,我使用这些信息简单地提取每个网格单元。
所有这些步骤之后,我得到类似于以下图片的图像: enter image description here enter image description here enter image description here 然后,我对每个提取的单元图像分别运行tesseract(最新的SVN版本和最新的训练数据),并尝试不同的-psm和-l值。
tesseract.exe -l eng -psm 11 sample.png outtext

tesseract产生的结果不是很好:
- 大部分字符无法识别。 - 网格线有时被解释为“l”或“i”字符。
我已经尝试过形态学操作(开、闭、腐蚀、膨胀)并用OTSU阈值替换自适应阈值(THRESH_OTSU),但结果变得更糟。
除了使用tesseract之外,我还可以尝试什么来提高识别质量?或者是否有更好的方法来提取字符(例如模板匹配)?
编辑(2014年12月21日):
我测试了简单的模板匹配(使用归一化交叉相关和LMS,但结果更差)。但是,通过使用findCountours提取每个字符,然后使用只包含一个字符和-psm 10选项运行tesseract,我已经迈出了很大的一步。此选项将每个输入图像解释为单个字符。此外,我在后处理步骤中删除非字母数字字符。第一个结果非常令人鼓舞,检测率达到90%甚至更高。主要问题是“9”和“g”和“q”字符的误检。
3个回答

1

如我在这里所说,你可以告诉Tesseract注意“几乎相同”的字符。 此外,Tesseract中有一些选项在你的示例中并没有帮助。 例如,“Pocahonta5S”大多数时候会变成“PocahontaSS”,因为数字是字母单词中的一个。你可以这样看。

关于预处理,最好使用锐化滤镜。 不要忘记,Tesseract在读取任何内容之前总是会应用Otsu过滤器。 如果你想得到好的结果,锐化+自适应阈值和其他滤镜是不错的选择。


1

我建议使用OpenCV结合tesseract。

tesseract在输入图像中的问题是图像中的非字符区域。

我的方法

为了清除这些区域,我会使用OpenCV的findContour函数来获取二进制图像中的所有轮廓。然后定义一些标准来消除非字符区域。例如,只选择在图像内部且不接触边界的区域,或者仅选择具有特定区域面积或高宽比的区域。找到一些可以区分字符和非字符轮廓的特征。然后消除这些非字符区域并将图像传递给tesseract。

作为一般测试此方法的想法:

手动消除非字符区域(gimp或paint等),然后将图像提供给tesseract。如果结果符合您的期望,您可以尝试使用上述建议的方法消除非字符区域。


0

我建议使用我自己正在使用的类似方法。 (我只有速度问题,如果只是比较一些字符,您不应该有这个问题)

第一步:使表单具有默认大小并进行转换: https://www.youtube.com/watch?v=W9oRTI6mLnU

第二步:使用matchTemplate Improve template matching with many templates for one Image/ find characters on image

我还尝试了OCR,但因为以下两个原因而不喜欢它:

  1. 某种黑盒子,难以调试为什么无法识别
  2. 对于包含“完美”字符的屏幕截图,即使我尝试过很多方法,也永远不会100%准确。

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