获取复杂形状的中心线

Getting center line of a complex shape

提问人:generic_dev_name 提问时间:11/17/2023 更新时间:11/17/2023 访问量:38

问:

首先,对不起,标题不好,但我发现很难用一句话来概括这个话题。

第二件事:问题。

我有一个点列表,这些点通过其轮廓、厚度和所有来定义复杂形状。 我需要“缩小”形状,直到我得到一条没有粗细的线,但这保持了原始形状的外观。

简化图像,以便更好地理解

在图像中,黑色是我所拥有的,红色是我想要获得的。

我的问题与此类似:如何获得复杂形状多边形的中心线

但这并不能真正解决我的问题。

有什么建议吗? 我正在使用 C#,如果它是需要的信息。

我真的不知道从哪里开始

C# 几何

评论

0赞 Thomas 11/17/2023
我该如何解决这个问题:对点应用德劳尼三角测量,计算每个三角形的圆心,并将它们连接起来以表示相邻的三角形。您可能需要清理线路并删除波浪线。如果你只有边缘点,我会添加/插值点,直到它们不超过该图形的厚度。

答:

0赞 JonasH 11/17/2023 #1

这似乎与“骷髅化”或“变薄”非常相似。

这些是对二进制图像数据执行的所谓形态学操作。因此,如果您有任何其他类型的形状,可以先将其转换为光栅图像。

请注意,我使用的是“白色”= 1,“黑色”= 0。基本算法可能如下所示:

对于所有像素:

  1. 如果它是黑色的,请忽略它
  2. 如果所有邻居都是白色的,请保持白色
  3. 如果有些邻居是白人,有些是黑人
    1. 如果有黑色的、未连接的邻居,请保持白色。即仅通过我们正在检查的像素相互连接的相邻像素。
    2. 如果有一个白人邻居,请保留它
    3. 否则,请将其设置为黑色
  4. 从头开始重复,直到没有进一步的更改

关于第 3 点的例子

//Keep white examples
0 1 1    0 0 1     1 0 1    0 0 1 
0 1 0    0 1 0     0 1 1    1 1 1 
0 1 0    0 0 0     0 1 0    0 0 1 

//Set black examples
0 0 1    0 0 1     1 0 1    1 1 1 
0 1 1    0 1 1     1 1 1    1 1 1 
0 1 1    0 0 0     1 1 1    0 0 0 

这里的重点是保留属于单个 1 像素宽线的像素或线的端点,并删除属于边框的像素。

OpenCV 或 .Net 包装器 emguCV 有一种瘦身方法。但我没有使用过它,所以不能评论它的用法。