【发布时间】:2012-01-31 14:37:33
【问题描述】:
我正在编写一个 OCR 应用程序来从屏幕截图中读取字符。目前,我只关注数字。我的方法部分基于这篇博文:http://blog.damiles.com/2008/11/basic-ocr-in-opencv/。
我可以使用一些巧妙的阈值成功提取每个单独的字符。事情变得有点棘手的地方是匹配字符。即使使用固定的字体和大小,也有一些变量,例如背景颜色和字距调整,会导致相同的数字以略微不同的形状出现。例如,下图被分割成 3 部分:
- 顶部:我从屏幕截图中成功提取的目标数字
- 中间:模板:我的训练集中的一个数字
- 底部:顶部和中间图像之间的误差(绝对差异)
所有部分都被缩放了(两条绿色水平线之间的距离代表一个像素)。
您可以看到,尽管顶部和中间的图像都清楚地表示了 2,但它们之间的误差相当高。这在匹配其他数字时会导致误报——例如,不难看出,在上图中,放置良好的 7 可以比中间图像更好地匹配目标数字。
目前,我正在处理这个问题,方法是为每个数字生成一堆训练图像,并将目标数字与这些图像进行匹配,一个接一个。我尝试获取训练集的平均图像,但这并不能解决问题(其他数字上的误报)。
我有点不愿意使用移位模板执行匹配(这与我现在所做的基本相同)。有没有比简单的绝对差异更好的方法来比较两张图像?我在想可能像 2D 中的 EMD(地球移动器距离,http://en.wikipedia.org/wiki/Earth_mover's_distance):基本上,我需要一种对全局偏移和局部小变化不敏感的比较方法(白色像素旁边的像素变为白色,或黑色像素旁边的像素变为黑色),但对全局变化很敏感(远离白色像素的黑色像素变为黑色,反之亦然)。
谁能提出比绝对差更有效的匹配方法?
我在 OpenCV 中使用 C 风格的 Python 包装器 (import cv) 完成所有这些工作。
【问题讨论】: