2015-12-10 66 views
2

这是一个二进制图像的例子,即作为输入,我们有一个imageByteArray和2个可能的值:0255如何减少二进制图像中的背景噪音

例1:enter image description here

例2:enter image description here

该图像包含在背景一些原稿边缘。

该任务是删除,减少背景像素的数量对边缘像素的影响最小

问题是现代算法存在哪些技术来做到这一点?

我不希望作为一个答案是什么:使用高斯模糊摆脱背景噪音,使用黑白算法(康力,索贝尔等)阈值或使用霍夫(霍夫线性的推移这种噪声疯狂不管是什么选项已设置)

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

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

+1

这是您的输入图像的黑/白图像?如果是这样,很难提高图像的质量 –

+0

你可以研究形态学操作,虽然也许已经有太多的噪音来做任何形态学上合理的事情。 – hbaderts

+0

作为输入我有标准的RGB图像,上面的图像是灰度,模糊和索贝尔处理的结果。 –

回答

0

我认为你做了平均二进制图像,而不是双调...

基于待办事项洪水填充细分

  1. 为组像素扫描图像color=255
  2. 为每组像素创建其区域的蒙版/地图

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

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

  4. 检测边缘线

    • 边缘线具有矩形边界框,以便测试其纵横比如果接近方形,那么这是不边缘线
    • 也太小边界框表示不是边缘线
    • 太小填充编辑像素的比较计数到边框大边尺寸则面积也不是一个边缘线
    • 你可以让这个更强大的,如果你退步线为每个区域的像素集合并计算回归线和各组像素之间的平均距离。如果过高的区域未边缘线...
  5. 重新着色的非边缘线的区域为黑色

    所以无论是从。减去图像或洪水的面具与黑色再补......

[注释]

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

0

对于这样的任务,你通常会仔细检查输入数据,并试图找出线索,你可以利用什么补。但不幸的是,你只提供了一个例子,这使得这种方法非常无用。此外,这种表示方式并不舒服 - 您是否已经完成了一些预处理,或者您可以将其作为输入?在第一种情况下,如果您能向我们展示真正的投入,您可能会得到更好的建议

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

此外,在图像您提供您可以使用本地统计压制规则干扰的区域。如果您适当选择邻域大小,这将减少背景混乱。

但同样,如果你的文件检测这样 - 有可能是更稳健的做法。例如,如果您知道前景对象(驾驶员ID) - 您可以尝试收集ID图像的数据集,并计算“典型”颜色直方图 - 它可能更具特色。之后,您可以在输入图像上反向投影该直方图,并获得感兴趣的粗糙区域,或者甚至精确的掩模。然后你可以对它进行二值化并尝试检测轮廓。您可以尝试不同的色彩空间和容器大小,以查看哪种最适合。

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

+0

我应该在问题中写下更多的上下文,我的错误。 作为输入我有标准的RGB图像与文件(例如驱动程序许可证ID)在一些背景。主要任务是检测文档边缘。接下来的步骤是众所周知的:灰度,模糊,Sobel二值化,Hough概率,找到矩形或梯形(如果找到梯形形状然后进行透视变换)。在简单的对比背景下,它一切正常。我之所以会问降噪问题,是因为我需要处理数千种背景,而且无论使用什么选项,都会产生噪音。 –

+0

无论Hough如何配置,附加线路可能会欺骗后续逻辑并严重影响性能,噪音会导致额外的线路。 (它在java脚本中实现,没有OpenCV或GPU支持)。如果我错过了水平,并且你知道更有效和强大的方法不受背景影响,请让我知道。 –

+0

编辑答案 – alexisrozhkov

0

严格回答的问题的二值图像(即伤害为已经取得后):

什么似乎相对于噪声的边缘像素的特性是,它们形成(相对)长和光滑链。

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

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

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

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

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

1

很难知道这种做法是否会与所有的图像工作,因为你只提供一个,但霍夫线路检测与ImageMagick的,并在终端命令行这些参数会产生这样的:

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

+0

是的,您是对的,对于某个图像,几乎总是可以设置Hough参数来查找边缘线。但是,在一种情况下,最佳参数(案例=背景,文档类型,位置,方向,光线条件,角度等)可能不会在另一行中提供必要的行或额外的行。 所以有两种选择: 根据输入图像动态设置Hough参数(这非常困难并且经验丰富)。 设置静态霍夫参数适用于大多数情况,对于困难的背景,在使用霍夫之前先进行降噪处理。 –

0

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

相关问题