我发现你的问题很有趣,我会试着给你一些想法,但不幸的是不是一个完整的算法(你知道,这需要时间......)。我还会给您留下一些未回答的问题。
我认为您发布的图像是二进制图像,即黑色像素的值为 0,白色像素的值为 1。我忽略了红色像素,因为我认为您绘制它们是为了突出显示您想要连接虚线的位置;忽略红色像素意味着我会将它们的值设置为零。
首先我们需要一些定义。
一个非边界像素有 8 个相邻像素(西北、北、东北、东、东南、南、西南、西):
abc
h*d
gfe
在上图中,* 表示像素,a,b,c,d,e,f,g 和h 表示它的 8 个相邻像素。
我将端点像素定义为一个值为 1 的像素,只有一个值为 1 的邻居,其余邻居的值为 0,例如,此图显示了一个端点像素
000
011
000
因为d=1 和所有剩余的邻居都是零。
下图显示了一个不是端点像素的像素,因为它有两个等于一的邻居(a=1 和 e=1)
100
010
001
现在我们可以开始描述一个简单算法的一部分了。
在第一步中,找到所有端点像素并将它们放入一个向量中:在下图中,我将端点标记为 1 到 15(请注意,端点 15 在您发布的图像中没有突出显示)。
在第二步中,对于每个端点,找到它最近的端点:例如考虑端点 4,它最近的端点是 5。现在,如果你遵循连接一个端点与其最近端点的简单规则,你将有段连接4-5、10-11、13-14,都可以。但是考虑 1:它最近的端点是 2 或者它可能是 3,但我希望算法只是连接 2 和 3,同时将 1 连接到最左边的垂直线。我也希望 6、9 和 12 具有相同的行为。
现在情况不同了:6、7 和 8 呢?暂时忽略 8,6 的最近端点是 7,但它们已经连接,我们如何管理这种情况?
最后,考虑一下 15:为什么没有在您发布的图片中突出显示它?也许应该忽略它?