屏幕截图中低分辨率文本的 OCR

Posted

技术标签:

【中文标题】屏幕截图中低分辨率文本的 OCR【英文标题】:OCR of low-resolution text from screenshots 【发布时间】: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) 完成所有这些工作。

【问题讨论】:

【参考方案1】:

我会考虑使用 Haar 级联。我已经将它们用于人脸检测/头部跟踪,看起来你可以用足够多的 '2's、'3's、'4's 等构建一组相当不错的级联。

http://alereimondo.no-ip.org/OpenCV/34

http://en.wikipedia.org/wiki/Haar-like_features

【讨论】:

谢谢!我一定会看看 Haar 级联。与简单的图像减法相比,您认为它的效率如何?我希望它会更慢。但是,如果它慢 5 倍但替换 10 次图像检查以获得相同的效果,那绝对值得。 你必须生成级联,这是一个非常耗时的过程(但也愚蠢地并行化)。它还需要一堆输入数据(我会使用桌面上每种字体的数字)。 比减法慢,但您可以一次在图像中搜索某个级联的所有实例。【参考方案2】:

在嘈杂的图像上进行 OCR 并不容易 - 所以简单的方法不会奏效。

因此,我建议您使用HOG 提取特征并使用 SVM 进行分类。 HOG 似乎是描述形状最有力的方式之一。

整个处理管道是在 OpenCV 中实现的,但是我不知道 python 包装器中的函数名称。您应该能够使用最新的 haartraining.cpp 进行训练 - 它实际上支持的不仅仅是 haar - HOG 和 LBP。

而且我认为最新的代码(来自trunk)比官方版本(2.3.1)有了很大的改进。

HOG 通常只需要其他识别方法使用的训练数据的一小部分,但是,如果您想对部分被遮挡(或缺失)的形状进行分类,则应确保在训练中包含一些此类形状。

【讨论】:

我不会把这些图像称为 noisy 本身,但我知道你来自哪里。我去看看HOG。谢谢。【参考方案3】:

我可以根据我的经验和阅读几篇关于字符分类的论文告诉你,一个好的开始方法是阅读主成分分析 (PCA)、Fisher 的线性判别分析 (LDA) 和支持向量机 (SVM) )。这些是对 OCR 非常有用的分类方法,事实证明 OpenCV 已经在 PCAs 和 SVMs 上包含了出色的实现。我还没有看到任何 OCR 的 OpenCV 代码示例,但是您可以使用一些修改版本的人脸分类来执行字符分类。 OpenCV 人脸识别代码的优秀资源是this website。

我向您推荐的另一个 Python 库是“scikits.learn”。将 cvArrays 发送到 scikits.learn 并在您的数据上运行机器学习算法非常容易。使用 SVM 进行 OCR 的基本示例是 here。

另一个使用流形学习进行手写字符识别的更复杂的例子是here。

【讨论】:

以上是关于屏幕截图中低分辨率文本的 OCR的主要内容,如果未能解决你的问题,请参考以下文章

Swift 中的文本视图屏幕截图?

专门为渲染文本设计开源 OCR 引擎(截图)

用于屏幕文本的 OCR(光学字符识别)

提高屏幕截图上的 Tesseract OCR 准确性

识别屏幕截图中字符的最佳方法?

从视频游戏屏幕截图中提取尽可能多的文本的最佳方法是啥?