我有一些手绘图形(电路)的阈值图像,但有些部分我需要在两点之间关闭间隙,如下图所示:
我尝试关闭(先膨胀后腐 eclipse ),但它不起作用。它不会填补空白并使电阻器和其他组件无法识别。我找不到合适的变形大小和迭代次数的值来给我一个好的结果而不影响图片的其余部分。重要的是不要影响太多的组件。 我不能使用 hough 线,因为间隙并不总是成直线。
关闭后的结果:
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);
有什么想法吗? 提前致谢。
最佳答案
我的建议:
通过形态细化(选择只有一个白色邻居的白色像素)找到断裂的端点;
在每个端点周围的小社区中,通过盘旋*达到限制半径找到最近的端点;
在它们之间画一条粗线段。
*在这一步中,在不同的连接组件中寻找邻居非常重要,以避免将一 block 连接到自身;所以你还需要 blob 标签。
在这种细化中,有比原始图片更多的中断,因为我删除了方框。
当然,您在原始图像中绘制填充段。
这个过程并不完美,因为有时会丢失端点,有时会考虑不需要的端点。
作为一种改进,您可以尝试估计端点的方向,并且只有搜索是一个角扇区。
关于c++ - 如何填补 OpenCV 中二进制图像中的空白?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47344209/