我有一些手绘图形(电路)的阈值图像,但有些部分我需要在两点之间关闭间隙,如下图所示:
我尝试关闭(扩张然后侵蚀),但它不起作用。它不会填补间隙,使电阻器和其他元件无法识别。我无法找到适合变形大小和迭代次数的值,这样可以在不影响图片其余部分的情况下获得良好的结果。重要的是不要过多地影响组件。 我不能使用霍夫线,因为间隙并不总是在线。
结束后的结果:
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);
有什么想法吗? 提前致谢。
答案 0 :(得分:2)
我的建议:
通过形态细化找到断点的端点(选择只有一个白色邻居的白色像素);
在每个端点周围的小邻域中,通过绕*达到极限半径来找到最近的端点;
在它们之间画一段粗细。
*在此步骤中,寻找不同连接组件中的邻居非常重要,以避免将一块连接到自身;所以你也需要blob标签。
在这种细化中,有比原始图片更多的断点,因为我擦除了这些盒子。
当然,您在原始图像中绘制填充段。
这个过程并不完美,因为有时端点会丢失,有时会考虑不需要的端点。
作为一种改进,您可以尝试估算端点的方向,只搜索是一个角度扇区。
答案 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获得相同的效果。