2016-07-27 34 views
1

我有一个几乎不变的线条的图像,我使用algorythm与形态操作来清除它们的图像。事情是,形态开放或闭合将线与图像的边缘合并,而不仅仅是融化邻居轮廓。我只需要通过形态学操作融合的邻居轮廓,并避免这条线与边缘融合,因为后来我无法从图像中清除该线的合并和平。即使我反转图像和变形,问题仍然存在。操作(图像像素从黑到白,白到黑,而不是打开我使用关闭)。形态学操作合并线条与图片的边缘

如何停止?

我用这个操作合并邻居轮廓:

Mat morphKernelClose = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new org.opencv.core.Size(25, 25)); 
Imgproc.morphologyEx(src, src, Imgproc.MORPH_CLOSE, morphKernelClose); 

简单的Canny图像:

enter image description here

使用MORPH_CLOSE后图片

此错误不允许我完全清除线(那些合并部分是左)通过使用第二形态学运算,相对的第一至使用。

+1

morphologyEx的C++版本具有处理边界的参数。不确定它们是否也存在于java(?)版本中。 – Micka

+0

谢谢。在Java中有一个函数超载:public static void morphologyEx(Mat src,Mat dst,int op,Mat kernel,Point anchor,int iterations,int borderType,Scalar borderValue)',其中** ** borderType - 像素外插方法。有关详细信息,请参阅“borderInterpolate”。**“和”** borderValue - 边界常量时的边界值。默认值有特殊含义。请参阅“createMorphologyFilter”以了解详细信息。用适当的参数操纵边界合并?我无法找到任何使用和解释此用法的来源。 –

+0

我想是的。去尝试一下。将其设置为border_constant并将值设置为0. – Micka

回答

1

由于FiReTiTiMicka帮助我解决这个问题。我用Micka的建议。

我使用了morphologyEx的第三个函数,它允许操纵边界。在这个问题给出的代码替换为一个:

Mat morphKernelClose = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new org.opencv.core.Size(25, 25)); 
Point anchor = new Point(morphKernelClose.size().width/2, morphKernelClose.size().height/2); 
Imgproc.morphologyEx(src, src, Imgproc.MORPH_CLOSE, morphKernelClose, anchor, 1, Core.BORDER_CONSTANT, new Scalar(0,0,0)); 

下面是结果: enter image description here

此方法可快速和容易的,但并不完美,因为它只是切断边界附近的像素。

如果您有任何建议如何改进这一点,它张贴在评论!

+1

边界效应总是很痛苦,而且很难避免。在你的情况下,我看到的唯一解决方案就是在处理之前扩展每一行,但这意味着首先找到它们的所有方向,然后再将它们扩展。我认为这不值得。 – FiReTiTi

2

最简单的解决方案将是,以增加图像的大小,用黑色填充的附加轮廓,然后执行操作:

  1. 创建更大的图像,全黑。
  2. 将图像复制到新图像的中间。
  3. 执行的操作
  4. 删除添加边框(图像的中心复制到一个新的)。
+1

而不是背面复制,可以使用子图像。 – Micka