【发布时间】: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”字符的误检测。
问候,
【问题讨论】:
标签: c++ opencv ocr tesseract template-matching