我正在做一些工作(太复杂无法解释),我所拥有的任务之一是我需要将平滑多边形的光栅图像转换为骨架。所以我需要做这样的事情:
我有光栅图像(在左侧),我想要一个由代表图像的点和边(右边)组成的图形。
我读过算法,特别是Steven Skiena的一本书,他告诉我使用“刷火”算法,他解释为“每个循环,遍历边缘的每个点,对于碰撞的边缘添加一个点到骨架并删除剩余的点,继续下一个循环,直到只留下骨架“但我在网上找到的所有信息都是关于机器人的一些寻路算法,我不明白如何应用它这里(基本上我怎么知道“边缘”,如果我只有填充/空白像素的坐标)。
我查了CGAL库并进行了骨架演示,但是当多边形有很多顶点时它不能很好,所以只需将边框上的每个顶点转换为多边形的顶点,然后将其输入算法即可不会产生好的结果。
我希望这必须是一个常见的算法,因为任务似乎很基本,但我不想发明轮子,我找不到关于这个主题的任何东西(也许是因为我不知道正确关键字)
答案 0 :(得分:3)
您的搜索更好的术语是数字细化,即中轴的数字版本。例如,本文引用了15种这样的算法:
“关于15种2D并行细化算法的注意事项。” M. Couprie(PDF download link)
这是图16的一小部分,显示了两个这样的算法的结果:
答案 1 :(得分:0)
这是我们的学校项目!它基于施莱辛格的角落和骨架化算法。角是一种以压缩形式表示二进制图像的方式,其允许比在光栅图像上更快的操作。有关更多信息,请参阅我们的论文:
Corners toolbox allowing processing binary images in a compressed form
骨架化实际上是我的一部分,我详细描述了它:-) 我认为C ++中的代码仍然是免费的,可以在某处使用。