典型的手机用户在为卡片大小的物体拍照时,图像中通常会包含一些背景纹理——请参考附件示例。在某些情况下,该背景可能会影响 OCR 的准确性。
我想知道是否有解决方案来去除背景(我肯定有),或者检测背景区域,以便可以在 OCR 之前将它们裁剪掉。在附加图像的情况下,木桌和台面展示是被删除的候选对象。我想对比色可能是一种解决方案,但不太确定。
典型的手机用户在为卡片大小的物体拍照时,图像中通常会包含一些背景纹理——请参考附件示例。在某些情况下,该背景可能会影响 OCR 的准确性。
我想知道是否有解决方案来去除背景(我肯定有),或者检测背景区域,以便可以在 OCR 之前将它们裁剪掉。在附加图像的情况下,木桌和台面展示是被删除的候选对象。我想对比色可能是一种解决方案,但不太确定。
在某些情况下,作为人类,您很难区分背景和前景,因此肯定没有方法可以正确地做您想做的事。既然您提到了 OCR,我假设您实际上想要消除非文本的所有内容。这实际上并没有使问题变得更容易,所以我实际上假设的是您想要保留与其他对象高度对比的对象(例如前景和背景,或白色背景上的黑色文本)。同样,没有完美的方法。
因此,所有这些答案要做的就是提供一种简单的方法,可以帮助您完成任务。该方法结合了现成的形态学工具和用于二值化的 Otsu 方法,因为它在统计上是最优的。结果是可能值得关注的区域。请注意,您当然需要将这些结果与许多其他不同的分析结合起来,一个好的 OCR 系统远远超出了这些直接方法。
方法: 1)将图像转换为灰度(对颜色不感兴趣,但不同的方法当然可以使用它们);2)使用h-dome变换去除不相关的最大值;3)计算形态梯度;4)通过大津二值化;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
您的示例的图像:
这些输出指示您应该在哪里查找文本,即连接组件的内部。