如何在 OpenCV 中填补二进制图像中的空白?
Posted
技术标签:
【中文标题】如何在 OpenCV 中填补二进制图像中的空白?【英文标题】:How can I fill gaps in a binary image in OpenCV? 【发布时间】:2017-11-17 06:00:45 【问题描述】:我有一些手绘图形(电路)的阈值图像,但有些部分我需要在两点之间关闭间隙,如下图所示:
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);
有什么想法吗? 提前致谢。
【问题讨论】:
【参考方案1】:我的建议:
通过形态细化的方式找到中断的端点(选择只有一个白色邻居的白色像素);
在每个端点周围的小社区中,找到最近的端点,方法是绕*到极限半径;
在它们之间画一条粗线。
*在这一步中,在不同的连通分量中寻找邻居是非常重要的,避免一个片断链接到它自己;所以你也需要 blob 标签。
在这个细化过程中,比你的原始图片中的中断更多,因为我删除了框。
当然,你在原始图像中绘制填充段。
这个过程不可能完美,因为有时会丢失端点,有时会考虑不需要的端点。
作为一种改进,您可以尝试估计端点的方向,并且只搜索一个角扇区。
【讨论】:
谢谢。我一直很忙,所以我没有足够的时间来证明你的解决方案,但现在我正在尝试,我认为它会奏效。【参考方案2】:我的建议是使用自定义卷积过滤器 (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来获得同样的效果。
【讨论】:
1/12
对于Python2
将等于0
,但是在Python3
中可以正常工作,最好使用1.0/12
感谢您的指出。我主要是作为伪代码编写的,忘记了初学者可能会陷入这个陷阱。以上是关于如何在 OpenCV 中填补二进制图像中的空白?的主要内容,如果未能解决你的问题,请参考以下文章