在OCR处理之前删除背景颜色或纹理

时间:2013-01-08 22:18:06

标签: image-processing computer-vision ocr

当典型的手机用户为卡片大小的物体拍照时,图像中通常会包含一些背景纹理 - 请参阅附带的样本。在某些情况下,该背景可能会污染OCR的准确性。

我想知道是否有解决方案或不删除背景(我是肯定的),或检测背景区域,以便可以在OCR之前将其裁剪掉。如果附加图像,木桌和反顶呈现是被删除的候选人。我认为对比色可能是一种解决方案,但不太确定。

enter image description here

enter image description here

enter image description here

enter image description here enter image description here

1 个答案:

答案 0 :(得分:3)

在某些情况下,作为一个人,你在背景和前景之间难以辨别,所以当然没有办法正确地做你想要的。既然你提到了OCR,我认为你实际上想要消除一切不是文本的东西。这实际上并没有使问题变得更容易,所以我实际上假设你想保留与其他对象高度对比的对象(例如前景和背景,或者白色背景上的黑色文本)。同样,没有完美的方法。

因此,所有这些答案都将提供一个简单的方法,可以帮助您完成任务。该方法是现成形态学工具和用于二值化的Otsu方法的组合,因为它在统计上是最佳的。结果是可能值得关注的区域。请注意,您肯定需要将这些结果与许多其他不同的分析结合起来,一个好的OCR系统远远超出了这些直接的方法。

方法:1)将图像转换为灰度(对颜色不感兴趣,但不同的方法肯定可以使用它们); 2)使用h-dome变换去除不相关的最大值; 3)计算形态梯度; 4)由otsu二进制化; 5)通过区域开口移除小物体。删除不相关的最大值对于你的任务非常重要,因为你可以拥有相当糟糕的区域,这些区域是由于坏相机和坏相机的闪光以及缺乏经验的摄影师组合而造成的。 H-dome变换基于形态重建,因此如果您的库具有后者而不是前者,则可以直接实现它(否则您可以学习如何有效地实现后者)。离散图像的形态梯度是一种非常简单的应用方法,即使在光照不好的情况下也能很好地工作,因为它是一种局部方法。 Otsu的结果阈值保持最强的边缘(可能包括噪声和其他次要特征)。您可以通过高斯平滑来先于所有这些,这可以作为噪声抑制的初始工具。通过区域开口可以很容易地去除小特征。在Matlab中,可以这样做:

f = rgb2gray(imread(yourimage));
se = strel('square', 3);
g = imhmax(f, 50);                    % h-dome with h = 50
g = imdilate(g, se) - imerode(g, se); % morphological gradient
h = im2bw(g, graythresh(g));          % graythresh applies Otsu's method
w = bwareaopen(h, 50);

假设小于50像素的对象无关紧要(对于小文本可能并非总是如此)。

以下是您的示例的w图片:

enter image description here enter image description here enter image description here enter image description here enter image description here

这些输出指示您应该在哪里查找文本,即连接组件的内部。