如何在OpenCV中填充二进制图像中的间隙?

时间:2017-11-17 06:00:46

标签: c++ image opencv image-processing

我有一些手绘图形(电路)的阈值图像,但有些部分我需要在两点之间关闭间隙,如下图所示:

Binary image

我尝试关闭(扩张然后侵蚀),但它不起作用。它不会填补间隙,使电阻器和其他元件无法识别。我无法找到适合变形大小和迭代次数的值,这样可以在不影响图片其余部分的情况下获得良好的结果。重要的是不要过多地影响组件。 我不能使用霍夫线,因为间隙并不总是在线。

结束后的结果:

Result after closing

int morph_size1 = 2;
Mat element1 = getStructuringElement(MORPH_RECT, Size(2 * morph_size1 + 1, 2 * morph_size1 + 1), Point(morph_size1, morph_size1));
Mat dst1; // result matrix
for (int i = 1; i<3; i++)
{
    morphologyEx(binary, dst1, CV_MOP_CLOSE, element1, Point(-1, -1), i);

}

imshow("closing ", dst1);

有什么想法吗? 提前致谢。

2 个答案:

答案 0 :(得分:2)

我的建议:

  • 通过形态细化找到断点的端点(选择只有一个白色邻居的白色像素);

  • 在每个端点周围的小邻域中,通过绕*达到极限半径来找到最近的端点;

  • 在它们之间画一段粗细。

*在此步骤中,寻找不同连接组件中的邻居非常重要,以避免将一块连接到自身;所以你也需要blob标签。

here

enter image description here

在这种细化中,有比原始图片更多的断点,因为我擦除了这些盒子。

当然,您在原始图像中绘制填充段。

这个过程并不完美,因为有时端点会丢失,有时会考虑不需要的端点。

作为一种改进,您可以尝试估算端点的方向,只搜索是一个角度扇区。

答案 1 :(得分:0)

我的建议是使用自定义卷积滤镜(cv :: filter2D),如下所示(可以更大):

0 0 1/12 0 0 
0 0 2/12 0 0 
1/12 2/12 0 2/12 1/12
0 0 2/12 0 0
0 0 1/12 0 0 

当两个线段彼此靠近时,我们的想法是填补空白。您也可以使用custom structuring elements获得相同的效果。