【问题标题】:Morphological operations merges lines with edges of pictures形态学操作将线条与图片边缘合并
【发布时间】:2016-07-28 22:16:12
【问题描述】:

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

如何阻止这种情况?

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

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 后的图像:

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

【问题讨论】:

  • morphologyEx 的 c++ 版本具有处理边框的参数。不确定它们是否也存在于 java (?) 版本中。
  • 谢谢。 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”。“那么这个函数重载是否允许我使用适当的参数来操作与边界的合并?我找不到任何使用和解释这个用法的来源。
  • 我猜是的。去尝试一下。将其设置为 border_constant 并将值设置为 0。
  • 非常感谢,它确实有效。将其发布为答案,以便其他有同样问题的人可以获救,我可以给你接受和支持。如果你不愿意,我可以做到。修改后的行:Imgproc.morphologyEx(src, src, Imgproc.MORPH_CLOSE, morphKernelClose, new Point(morphKernelClose.size().width/2, morphKernelClose.size().height/2), 1, Core.BORDER_CONSTANT, new Scalar(0,0,0));。它基本上只是切断了图像边界附近的部分(这对我来说没问题),但并没有保留该部分。
  • 请用所有需要的信息(可能还有结果图像)自己写答案。您可以接受自己的答案。

标签: image opencv image-processing computer-vision


【解决方案1】:

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

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

【讨论】:

  • 可以使用子图像代替反向复制。
【解决方案2】:

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

结果如下:

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

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

【讨论】:

  • 边框效果总是很痛苦,而且很难避免。在你的情况下,我看到的唯一解决方案是在处理之前扩展每条线,但这意味着首先找到它们,它们的方向,最后扩展它们。我觉得不值得。
猜你喜欢
  • 2016-10-02
  • 1970-01-01
  • 2021-05-20
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-19
相关资源
最近更新 更多