2

这是二进制图像的示例,即作为输入,我们有一个具有 2 个可能值的 imageByteArray:0255

示例 1:在此处输入图像描述

示例 2:在此处输入图像描述

图像在背景上包含一些文档边缘。

任务是在对边缘像素的影响最小的情况下去除、减少背景像素的数量。

问题是有哪些现代算法和技术可以做到这一点?

我不期望的答案是:使用高斯模糊来消除背景噪声,使用双色调算法(Canny、Sobel 等)阈值或使用霍夫(无论设置什么选项,霍夫线性化都会对这种噪声发疯)

最简单的解决方案是检测所有轮廓并过滤掉长度最短的轮廓。这很好用,但有时取决于图像,它也会几乎消除有用的边缘像素。

更新:作为输入,我在某些背景上有带有文档(驾驶执照 ID、支票、账单、信用卡...)的标准 RGB 图像。主要任务是检测文档边缘。接下来的步骤是众所周知的:灰度、模糊、Sobel 二值化、霍夫概率、找到矩形或梯形(如果找到梯形,则进行透视变换)。在简单的对比背景上一切正常。我询问降噪的原因是我必须处理数千个背景,并且无论使用什么选项,其中一些都会产生噪音。无论 Hough 如何配置,噪声都会导致额外的线路,并且额外的线路可能会欺骗后续逻辑并严重影响性能。(它在 java 脚本中实现,不支持 OpenCV 或 GPU)。

4

5 回答 5

1

很难知道这种方法是否适用于您的所有图像,因为您只提供了一个,但是使用 ImageMagick 和终端命令行中的这些参数进行霍夫线检测会产生以下结果:

convert card.jpg                                               \
    \( +clone -background none -fill red -stroke red           \
       -strokewidth 2 -hough-lines 49x49+100 -write lines.mvg  \
    \) -composite hough.png

在此处输入图像描述

该文件lines.mvg包含 4 行,如下所示:

# Hough line transform: 49x49+100
viewbox 0 0 1024 765
line 168.14,0 141.425,765  # 215
line 0,155.493 1024,191.252  # 226
line 0,653.606 1024,671.48  # 266
line 940.741,0 927.388,765  # 158

ImageMagick 安装在大多数 Linux 发行版上,并且可从此处用于 OSX 和 Windows 。

于 2015-12-13T18:09:14.297 回答
0

我假设你的意思是二进制图像而不是双色调......

做基于洪水填充的分割

  1. 扫描图像设置像素( color=255)
  2. 为每个集合像素创建其区域的掩码/映射

    只需用 4 或 8 个相邻连接填充集像素,然后计算填充了多少像素。

  3. 对于每个填充区域计算其边界框

  4. 检测边缘线

    • 边缘线有矩形边界框,所以测试它的纵横比,如果接近正方形那么这不是边缘线
    • 边界框太小也意味着不是边缘线
    • 与边界框相比,填充像素太小
    • 如果您对每个区域的集合像素进行回归线并计算回归线与每个集合像素之间的平均距离,则可以使其更加稳健。如果太高的区域不是边缘线...
  5. 将非边缘线区域重新着色为黑色

    所以要么从图像中减去蒙版,要么再次用黑色填充......

[笔记]

有时第 5步可能会弄乱文档的内部。在这种情况下,您无需重新着色任何内容,而是记住边缘区域的所有回归线。然后在整个过程完成后,将所有平行且靠近同一轴(无限线)的线连接在一起,这应该减少到确定文档矩形的 4 条大线。所以现在用黑色填充所有外部像素(通过几何方法)

于 2015-12-11T07:50:45.527 回答
0

对于此类任务,您通常会仔细检查输入数据并尝试找出可以利用的线索。但不幸的是,您只提供了一个示例,这使得这种方法毫无用处。此外,这种表示方式使用起来不太舒服——您是否进行了一些预处理,或者这就是您得到的输入?在第一种情况下,如果您能向我们展示真实的输入,您可能会得到更好的建议。

接下来,如果您的目标是降噪而不是文档/背景分割 - 您的选择真的很有限。与您所说的类似,我会尝试检测强度为 255 的连接组件(而不是检测轮廓,这可能不太健壮)并删除面积较小的组件。这在某些情况下可能会失败。

此外,在您提供的图像上,您可以使用局部统计数据来抑制常规噪声区域。如果您适当地选择邻域大小,这将减少背景混乱。

但同样,如果您这样做是为了进行文档检测 - 可能会有更强大的方法。

例如,如果您知道前景对象(驾驶员 ID) - 您可以尝试收集 ID 图像数据集,并计算“典型”颜色直方图 - 它可能具有相当的特征。之后,您可以将此直方图反向投影到输入图像上,并获得粗略的感兴趣区域,甚至可能是精确的掩码。然后您可以对其进行二值化并尝试检测轮廓。您可以尝试不同的色彩空间和 bin 大小,看看哪个最适合。

如果您必须在不同的光照条件下工作,您可以尝试均衡直方图或进行一些其他预处理,以减少光照引起的颜色变化。

于 2015-12-12T11:24:58.960 回答
0

严格回答二进制图像的问题(即在造成伤害之后):

与噪声相比,边缘像素的特征似乎是它们形成(相对)长而平滑的链。

到目前为止,我没有看到比跟踪所有 8 连接像素链更好的方法,例如使用轮廓跟踪算法,并检测直线部分,例如通过 Douglas-Peucker 简化。

由于噪音仅在卡的外部,斑点的轮廓将至少有一个“干净”的部分。保留足够长的部分。

这也可能会破坏弯曲的角落,实际上您应该寻找足够长的“平滑”路径。

不幸的是,我无法建议任何特定的算法来解决这个问题。它可能应该基于与几何相结合的图形分析(枚举图形中的长路径并检查局部/全局曲率)。

据我所知(在阅读了数千篇相关文章之后),文献中没有提到这一点。

于 2015-12-13T15:11:40.913 回答
0

以前的答案都不会真正起作用,唯一可以在这里起作用的是blob过滤器,过滤它以便删除低于一定大小的blob。

于 2016-03-25T15:54:07.250 回答