形态学操作将线条与图片边缘合并

时间:2016-07-27 22:43:56

标签: image opencv image-processing computer-vision

我的图像中有几乎恒定的线条,我使用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后的图像:

enter image description here

这个错误不允许我通过使用第二个形态学操作完全清除线条(剩下那些合并的部分),与第一次使用相反。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

感谢 FiReTiTi Micka 帮助我解决此问题。我使用了Micka的建议。

我使用了physicsEx的第三个功能,它允许操纵边框。问题中给出的代码将替换为此代码:

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

这种方法既快速又简单,但并不完美,因为它只会切断边界附近的像素。

如果您有任何建议如何改进,请在评论中发布!