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

Morphological operations merges lines with edges of pictures

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

如何停止?

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

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

简单的 Canny 图像:

使用后的图片MORPH_CLOSE:

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

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

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

感谢 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));

结果如下:

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

如果您有任何改进建议,请post在评论中提出!