我有一些手绘图形(电路)的阈值图像,但是有些地方我需要在两点之间缩小缝隙,如下图所示:

Binary image

我尝试关闭(先扩张再侵 eclipse ),但无法正常工作。它无法填补空白,并使电阻器和其他组件无法识别。我找不到合适的顶点变形大小和迭代次数来获得良好的效果,而又不影响其余图片。重要的是不要影响太多组件。
我不能使用高音线条,因为间隙并不总是成直线。

关闭后的结果:

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);

任何的想法?
提前致谢。

最佳答案

我的建议:

  • 通过形态细化(选择仅具有一个白色邻居的白色像素)找到中断的端点;
  • 在每个端点周围的小邻域中
  • ,通过盘旋*达到最大半径来找到最接近的端点;
  • 在它们之间绘制一个粗线段。

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

    c&#43;&#43; - 如何填补OpenCV中二进制镜像的空白?-LMLPHP

    c&#43;&#43; - 如何填补OpenCV中二进制镜像的空白?-LMLPHP

    在这种细化过程中,由于我清除了这些框,因此比您原始图片中的中断更多。

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

    此过程可能并不完美,因为有时会缺少端点,有时会考虑使用不需要的端点。

    作为改进,您可以尝试估算端点处的方向,并且仅搜索是一个 Angular 扇区。

    10-08 11:41