c++ - 提高 Tesseract 检测质量

标签 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”或“i”字符。

我已经尝试了形态学操作(打开、关闭、腐 eclipse 、膨胀)并用 OTSU 阈值 (THRESH_OTSU) 替换了自适应阈值,但结果变得更糟。

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

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

问候,

最佳答案

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

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

关于c++ - 提高 Tesseract 检测质量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27587343/

相关文章:

c++ - 使用模板类重载友元运算符

fonts - 显式设置 Tesseract-OCR 识别使用的字体

c++ - 在OpenCV中将二值图像转换为RGB

c++ - Tesseract baseapi 错误 : 'strncpy' :this function or variable may be unsafe. 考虑改用 strncpy_s

iphone - iPhone 中具有文本检测功能的增强现实引擎

C++删除没有括号的数组内存仍然有效吗?

c++ - Intellisense 期望 ';' 带有多行字符串文字

c++ - UI 配置模式

python - OpenCV 保存图像显着增加了 .tif 文件的大小

python - 检测图像中的多个圆圈