我正在编写OCR应用程序以从屏幕截图图像中读取字符。目前,我只关注数字。我部分基于我的方法在这篇博文中:http://blog.damiles.com/2008/11/basic-ocr-in-opencv/。来自屏幕截图的低分辨率文本的OCR
我可以使用一些聪明的阈值成功地提取每个单独的字符。有些棘手的地方是匹配字符。即使使用固定的字体和大小,也会有一些变量,例如背景颜色和字距,这些变量会导致相同的数字以不同的形状出现。例如,下面的图像分割成3个部分:
- 上:我成功地从截图中提取的对象位的
- 中东:模板:从我训练的一个数字设置
- 下图:顶部和中间图像之间的误差(绝对差值)
零件已全部缩放(两条绿色水平线之间的距离表示一个像素)。
你可以看到,尽管顶部和中间图像清晰表示2,它们之间的误差是相当高的。这会导致在匹配其他数字时出现误报 - 例如,不难看出放置良好的7可以如何匹配图像中的目标数字比中间图像更好。
目前,我正在处理这个问题的方法是为每个数字设置一堆训练图像,并将目标数字与这些图像相匹配,一一对应。我尝试了训练集的平均图像,但这并不能解决问题(其他数字上的误报)。
我有点不愿意使用移位模板执行匹配(它与我现在所做的基本相同)。有没有比简单的绝对差异更好地比较两幅图像的方法?我想到的可能是类似于2D中的EMD(推土机距离,http://en.wikipedia.org/wiki/Earth_mover's_distance):基本上,我需要一种比较方法,它不像全局移动和局部小变化那样敏感(白色像素旁边的像素变为白色,或黑色像素旁边的像素变为黑色),但对全局变化敏感(黑色像素远不及白色像素变为黑色,反之亦然)。
任何人都可以提出一个比绝对差异更有效的匹配方法吗?
我使用C风格的Python包装(import cv
)在OpenCV中完成所有这些工作。
谢谢!我一定会看看哈尔瀑布。你认为它将与简单图像减法相比有多高效?我预计它会变慢。但是,如果速度慢5倍,但取代10个图像检查以获得相同的效果,那么它肯定值得。 – misha 2012-01-02 05:03:38
您必须生成级联,这是一个非常耗时的过程(但也是愚蠢的可并行化)。它还需要大量的输入数据(我会使用桌面上每种字体的数字)。 – rsaxvc 2012-01-02 05:17:04
慢于减法,但您可以一次搜索特定级联的所有实例的图像。 – rsaxvc 2012-01-02 05:19:19