如何减少二进制图像中的背景噪音

时间:2015-12-10 12:27:34

标签: algorithm image-processing noise-reduction binary-image

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

示例1:enter image description here

示例2:enter image description here

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

任务是在边缘像素上移除,减少背景像素的影响

问题是现代算法,技术的存在是做什么的?

我不希望作为答案:使用高斯模糊去除背景噪音,使用双色调算法(Canny,Sobel等)阈值或使用霍夫(无论选项是什么,霍夫线性化对此类噪音都很疯狂设置)

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

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

5 个答案:

答案 0 :(得分:1)

很难知道这种方法是否适用于所有图像,因为您只提供了一种,但使用ImageMagick进行Hough Line检测并在终端命令行中生成这些参数:

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

enter image description here

,文件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发行版上,可从here用于OSX和Windows。

答案 1 :(得分:0)

我认为你的意思是二进制图像而不是bitonic ......

基于洪水填充的细分

  1. 扫描图像以设置像素color=255
  2. 为每个设置像素创建其区域的遮罩/地图

    只需使用4或8个邻居连接填充设置像素,并计算您填充的像素数。

  3. 每个填充区域的
  4. 计算其边界框

  5. 检测边线

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

    所以要么从图像中减去遮罩,要么再用黑色填充......

  7. <强> [注释]

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

答案 2 :(得分:0)

对于此类任务,您通常会仔细检查输入数据并尝试找出可以使用的提示。但不幸的是,你只提供了一个例子,这使得这种方法毫无用处。此外,这种表示并不适合使用 - 你做过一些预处理,或者这是你得到的输入?在第一种情况下,如果您能向我们展示真实的意见,您可能会得到更好的建议。

接下来,如果您的目标是降低噪音而不是文档/背景细分 - 那么您的选项实际上是有限的。与你所说的类似,我会尝试检测具有255强度的连通分量(而不是检测轮廓,这可能不那么健壮)并删除具有小面积的轮廓。在某些情况下可能会失败。

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

但同样,如果您正在进行文档检测,那么可能会有更强大的方法。

例如,如果你知道前景对象(驱动程序的ID) - 你可以尝试收集ID图像的数据集,并计算出典型的&#39;颜色直方图 - 它可能很有特色。之后,您可以在输入图像上反投影该直方图,并获得感兴趣的粗糙区域,甚至可能是精确的掩模。然后你可以将它二值化并尝试检测轮廓。您可以尝试不同的颜色空间和箱尺寸,以确定哪种最适合。

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

答案 3 :(得分:0)

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

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

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

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

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

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

据我所知(在阅读了数千篇相关文章后),这在文献中没有得到解决。

答案 4 :(得分:0)

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