提高 Tesseract 检测质量
Posted
技术标签:
【中文标题】提高 Tesseract 检测质量【英文标题】:Improve Tesseract detection quality 【发布时间】:2015-02-19 15:30:57 【问题描述】:我正在尝试从使用消费类相机(包括手机)拍摄的图像中提取无法形成有意义的单词的字母数字字符 (a-z0-9)。字符具有相同的大小和字体类型,并且没有格式化。实际处理是在Windows下完成的。
下图显示了原始输入:
透视处理后,我在 OpenCV 中应用以下内容:
从 RGB 转换为灰色 应用cv::medianBlur
去除噪音
使用自适应阈值处理将图像转换为二进制cv::adaptiveThreshold
我知道网格的行数和列数。因此,我只需使用这些信息提取每个网格单元。
完成所有这些步骤后,我得到的图像看起来类似于:
然后我在每个提取的单元格图像上单独运行 tesseract(具有最新训练数据的最新 SVN 版本)(我尝试了不同的 -psm
和 -l
值):
tesseract.exe -l eng -psm 11 sample.png outtext
tesseract产生的结果不是很好:
大多数字符无法识别。 网格线有时被解释为“l”或“i”字符。我已经尝试过形态学操作(打开、关闭、侵蚀、扩张),并用 OTSU 阈值 (THRESH_OTSU
) 替换了自适应阈值,但结果变得更糟。
我还可以尝试什么来提高识别质量?或者除了使用tesseract(例如模板匹配)之外,还有更好的方法来提取字符吗?
编辑(21-12-2014):
我测试了简单的模板匹配(使用标准化互相关和 LMS,但结果更差)。但是我向前迈出了一大步,使用findCountours
提取每个字符,然后只使用一个字符运行 tesseract,并使用-psm 10
选项将每个输入图像解释为单个字符。另外,我在后处理步骤中删除了非字母数字字符。第一个结果令人鼓舞,检出率达到 90% 甚至更高。主要问题是“9”、“g”和“q”字符的误检测。
问候,
【问题讨论】:
【参考方案1】:正如我所说的here,您可以告诉 tesseract 关注“几乎相同”的字符。 此外,tesseract 中有一些选项在您的示例中对您没有帮助。 例如,“Pocahonta5S”在大多数情况下会变成“PocahontaSS”,因为数字是一个字母词。你可以这样看。
关于预处理,您最好使用锐化滤镜。 不要忘记,tesseract 在阅读任何内容之前总是会应用 Otsu 的过滤器。 如果你想要好的结果,锐化 + 自适应阈值与其他一些过滤器是个好主意。
【讨论】:
【参考方案2】:我建议将 OpenCV 与 tesseract 结合使用。
tesseract 输入图像中的问题是图像中的非字符区域。
我自己的方法
为了摆脱这些,我会使用 openCV findContour 函数来接收二进制图像中的所有轮廓。然后定义一些标准来照亮非字符区域。例如只取图像内部且不接触边界的区域,或者只取具有特定区域面积或特定高宽比的区域。找到某种特征,让您区分字符和非字符轮廓。 然后消除这些非字符区域并将图像转发到 tesseract。
正如一般测试此方法的想法:
消除非字符区域手册(gimp或paint,...)并将图像提供给tesseract。如果结果符合您的预期,您可以尝试使用上述建议的方法消除非字符区域。
【讨论】:
【参考方案3】:我建议在我的案例中使用类似的方法。 (我只有速度的问题,如果只是比较一些字符,你不应该有)
首先:使表单具有默认大小并对其进行转换: https://www.youtube.com/watch?v=W9oRTI6mLnU
第二:使用matchTemplate Improve template matching with many templates for one Image/ find characters on image
我也玩过 OCR,但我不喜欢它,原因有两个:
-
某种黑盒,难以调试,为什么无法识别
就我而言,无论我做什么,即使是带有“完美”字符的屏幕截图,它也永远不会 100% 准确。
【讨论】:
以上是关于提高 Tesseract 检测质量的主要内容,如果未能解决你的问题,请参考以下文章
Python+OpenCV+Tesseract实现OCR字符识别