【发布时间】: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