确实,这并不是一件容易的事情……您可以尝试完全使用Graph结构。首先从图像中提取所有连接的像素,并将它们插入到Graph中,其中相邻节点通过一条边连接。您可以舍弃小于M个节点的图(以排除与图像无关的小斑点)。
在此过程结束时,您将具有一组断开连接的图。(从您的图像来看,这些树不完全是树,因为其中存在循环)
您可以通过从某个随机节点开始并执行DFS来找到每个图的极点(每个图的外围的极点像素)。
在此过程结束时,您将为每个图具有一组像素坐标,这些像素坐标对应于极有可能形成连接的极点。
现在,您可以尝试仅用一条直线连接最近的极值点邻居(距离<= 5)。
但是,如果您要考虑导致该极值像素的线段的斜率,则可以在达到该极值像素之前尝试将线“拟合”到N个像素。因此,如果N = 5,则分支的最后5个像素将用于估算线。
因此,对于每个最近的邻居对,您现在还有另一件事可以用作判断是否应连接两个线段的标准(即,极点距离<= 5像素和近似相等的线斜率)。
为了最大程度地减少可能使您的线条在分支的尖端附近出现锯齿(从而扭曲您的斜率估计值)的噪声影响,您可以尝试对图形应用简化步骤(这是另一个要点(除上面的DFS之外))使用Graph结构)。例如,您可以删除Graph的后续节点,这些节点会使直线以大于某些截止点的角度“弯曲”(有关更复杂的信息,请参见此处)。这样,您将使“较简单”的线条大致适应由图像像素形成的段的较大部分的方向。
在大多数情况下,这可能会导致人脉相通(根据您发布的图像判断),但仍然会给您带来一些挑战。例如,如何连接分支之一在连接点附近中断的“ Y”形中断模式?(即,您必须有一个“连续”折弯,并且必须与与其“混合”的线段相连)。也许您可以查看这种情况的普遍程度,然后再修改连接标准。
另外,也许值得研究如何改善图像采集(例如提高分辨率)。