我正在尝试从使用消费级相机(包括手机)拍摄的图像中提取不构成有意义单词的字母数字字符(a-z0-9)。这些字符具有相同大小和字体类型,且未经格式化。实际处理是在Windows下完成的。
下面的图像显示原始输入:
透视处理后,我使用OpenCV应用以下步骤:
- 将RGB转换为灰度 - 应用cv::medianBlur去除噪声 - 使用自适应阈值二值化图像cv::adaptiveThreshold - 我知道网格的行数和列数。因此,我使用这些信息简单地提取每个网格单元。
所有这些步骤之后,我得到类似于以下图片的图像:
然后,我对每个提取的单元图像分别运行tesseract(最新的SVN版本和最新的训练数据),并尝试不同的-psm和-l值。
tesseract产生的结果不是很好:
- 大部分字符无法识别。 - 网格线有时被解释为“l”或“i”字符。
我已经尝试过形态学操作(开、闭、腐蚀、膨胀)并用OTSU阈值替换自适应阈值(THRESH_OTSU),但结果变得更糟。
除了使用tesseract之外,我还可以尝试什么来提高识别质量?或者是否有更好的方法来提取字符(例如模板匹配)?
编辑(2014年12月21日):
我测试了简单的模板匹配(使用归一化交叉相关和LMS,但结果更差)。但是,通过使用findCountours提取每个字符,然后使用只包含一个字符和-psm 10选项运行tesseract,我已经迈出了很大的一步。此选项将每个输入图像解释为单个字符。此外,我在后处理步骤中删除非字母数字字符。第一个结果非常令人鼓舞,检测率达到90%甚至更高。主要问题是“9”和“g”和“q”字符的误检。
下面的图像显示原始输入:
![Original image](https://istack.dev59.com/J7qlP.webp)
- 将RGB转换为灰度 - 应用cv::medianBlur去除噪声 - 使用自适应阈值二值化图像cv::adaptiveThreshold - 我知道网格的行数和列数。因此,我使用这些信息简单地提取每个网格单元。
所有这些步骤之后,我得到类似于以下图片的图像:
![enter image description here](https://istack.dev59.com/qWihh.webp)
![enter image description here](https://istack.dev59.com/I0XFK.webp)
![enter image description here](https://istack.dev59.com/0DY3g.webp)
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”字符的误检。