提高Tesseract检测质量

时间:2014-12-21 06:51:39

标签: c++ opencv ocr tesseract template-matching

我正在尝试从使用消费者相机(包括移动电话)拍摄的图像中提取不形成有意义字的字母数字字符(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"或"我"字符。

我已经尝试过形态学操作(开放,闭合,侵蚀,扩张)并用OTSU阈值(THRESH_OTSU)取代自适应阈值,但结果变得更糟。

我还可以尝试提高识别质量?或者除了使用tesseract之外,还有更好的方法来提取字符(例如模板匹配?)?

编辑(21-12-2014): 我测试了简单的模板匹配(使用归一化的互相关和LMS,但结果更差)。但是我通过使用findCountours提取每个字符,然后仅使用一个字符运行tesseract和-psm 10选项将每个输入图像解释为单个字符,向前迈出了一大步。 Additonaly我在后处理步骤中删除了非字母数字字符。第一批结果令人鼓舞,检出率达到90%且更好。主要问题是错误检测" 9"和" g"和" q"字符。

此致

3 个答案:

答案 0 :(得分:1)

正如我所说here,你可以告诉tesseract注意"几乎相同"字符。 此外,tesseract中有一些选项在您的示例中无法帮助您。 例如,一个" Pocahonta5S"在大多数情况下,将成为一个" PocahontaSS"因为数字在一个字母单词中。你可以这样看。

关于预处理,您最好使用锐化滤镜。 不要忘记,在阅读任何内容之前,tesseract将始终使用Otsu的过滤器。 如果你想要好的结果,锐化+自适应阈值与其他一些过滤器是好主意。

答案 1 :(得分:1)

我建议将OpenCV与tesseract结合使用。

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

我自己的方法

为了摆脱这些,我会使用openCV findContour函数来接收二进制图像中的所有轮廓。然后定义一些标准以消除非字符区域。例如,仅拍摄图像内部并且不接触边界的区域,或仅拍摄具有特定区域面积或特定比率的高度与宽度的区域。找到某种功能,让您区分角色和非角色轮廓。 然后消除这些非字符区域并将图像处理为tesseract。

正如一般测试这种方法的想法一样:

消除非字符区域手册(gimp或paint,...)并将图像赋予tesseract。如果结果符合您的表达,您可以尝试使用上面提出的方法消除非字符区域。

答案 2 :(得分: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% 准确。