提问人:generic_dev_name 提问时间:11/17/2023 更新时间:11/17/2023 访问量:38
获取复杂形状的中心线
Getting center line of a complex shape
问:
首先,对不起,标题不好,但我发现很难用一句话来概括这个话题。
第二件事:问题。
我有一个点列表,这些点通过其轮廓、厚度和所有来定义复杂形状。 我需要“缩小”形状,直到我得到一条没有粗细的线,但这保持了原始形状的外观。
在图像中,黑色是我所拥有的,红色是我想要获得的。
我的问题与此类似:如何获得复杂形状多边形的中心线
但这并不能真正解决我的问题。
有什么建议吗? 我正在使用 C#,如果它是需要的信息。
我真的不知道从哪里开始
答:
0赞
JonasH
11/17/2023
#1
这些是对二进制图像数据执行的所谓形态学操作。因此,如果您有任何其他类型的形状,可以先将其转换为光栅图像。
请注意,我使用的是“白色”= 1,“黑色”= 0。基本算法可能如下所示:
对于所有像素:
- 如果它是黑色的,请忽略它
- 如果所有邻居都是白色的,请保持白色
- 如果有些邻居是白人,有些是黑人
- 如果有黑色的、未连接的邻居,请保持白色。即仅通过我们正在检查的像素相互连接的相邻像素。
- 如果有一个白人邻居,请保留它
- 否则,请将其设置为黑色
- 从头开始重复,直到没有进一步的更改
关于第 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 有一种瘦身方法。但我没有使用过它,所以不能评论它的用法。
上一个:隐式对象参数和此指针
评论