这确实不会很简单......您可以尝试完全使用 Graph 结构。首先从图像中提取所有连接的像素,并将它们插入到相邻节点与边缘连接的 Graph 中。您可以丢弃小于 M 节点数的图(以排除与图像无关的小点)。
在此过程结束时,您将拥有一组断开连接的图表。(从你的图片来看,这些不完全是树,因为那里有循环)
您可以通过从某个随机节点开始并执行DFS来找到每个 Graph 的极值点(每个 Graph 外围的极值像素) 。
在此过程结束时,您将获得每个 Graph 的一组像素坐标,这些坐标对应于更可能形成连接的极值点。
您现在可以尝试简单地用直线连接最近的极值点邻居(距离 <=5)。
但是,如果您想考虑导致该极值像素的线段的斜率,您可以在到达该极值像素之前尝试将一条线“拟合”到 N 个像素。因此,如果 N = 5,则分支的最后 5 个像素将用于估计一条线。
因此,对于每个最近邻对,您现在还可以使用另一件事作为判断两个线段是否应连接的标准(即极值点距离 <=5 像素和近似相等的线斜率)。
为了尽量减少可能使您的线在分支尖端附近出现锯齿状的影响(并因此扭曲您的斜率估计),您可以尝试对您的图表应用一个简化步骤(这是另一个点(除了上面的 DFS)它支付使用 Graph 结构)。例如,您可以删除图形的后续节点,这些节点会使线以大于某个截止值的角度“弯曲”(对于更复杂的情况,请参见此处)。通过这种方式,您将拟合“更简单”的线条,大致适合由图像像素形成的大部分片段的方向。
在大多数情况下,这可能会产生良好的联系(从您发布的图片来看),但它仍然会给您留下一些具有挑战性的问题。例如,其中一个分支在连接点附近被中断的“Y”形中断模式如何连接?(即,您有一个“连续”弯曲,必须与与其“混合”的线段连接)。也许您可以查看此类情况的常见程度,并稍后修改您的连接标准。
此外,也许值得研究如何改进图像采集(例如提高分辨率)。