形态学操作将线条与图片边缘合并
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:
这个错误不允许我使用第二次形态学操作完全清除线条(留下那些合并的部分),与第一次使用相反。
最简单的解决方案是增加图像尺寸,用黑色填充添加的轮廓,然后执行操作:
- 创建更大的图像,全黑。
- 将您的图片复制到新图片的中间。
- 执行操作
- 删除添加的边框(将图像的中心复制到新图像中)。
感谢 FiReTiTi 和 Micka 帮助我解决了这个问题。我采纳了 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在评论中提出!
我有一张图像,其中几乎有固定的线条,我使用算法和形态学操作将它们从图像中清除。问题是,形态学开或闭将线条与图像的边缘合并,而不是仅仅融合相邻的轮廓。我只需要用形态学操作融化相邻轮廓并避免该线与边缘合并,因为后来我无法从图像中清除线的合并和平。即使我反转图像并变形,问题仍然存在。操作(图像像素从黑到白,从白到黑,而不是打开我使用关闭)。
如何停止?
我用这个操作来合并相邻轮廓:
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:
这个错误不允许我使用第二次形态学操作完全清除线条(留下那些合并的部分),与第一次使用相反。
最简单的解决方案是增加图像尺寸,用黑色填充添加的轮廓,然后执行操作:
- 创建更大的图像,全黑。
- 将您的图片复制到新图片的中间。
- 执行操作
- 删除添加的边框(将图像的中心复制到新图像中)。
感谢 FiReTiTi 和 Micka 帮助我解决了这个问题。我采纳了 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在评论中提出!