我有一组近似曲面的 3d 点。然而,每一点都存在一些错误。此外,这组点包含的点比表示底层表面实际需要的点多得多。
我正在寻找的是一种算法来创建一个新的(小得多的)点集,代表一个简化的、更平滑的表面版本(请原谅没有比“简化、更平滑”更好的定义)。底层表面不是数学表面,所以我不希望将数据集拟合到某个数学函数。
我建议不要将其作为点云处理,而是使用 Delaunay 三角剖分对网格进行三角剖分:http ://en.wikipedia.org/wiki/Delaunay_triangulation
然后抽取网格。您可以研究抽取算法,但您可以使用仅合并具有相似法线的相邻 tris 的算法获得非常好的快速和肮脏的结果。
存在几种不同的基于点的表面模型简化技术,包括:
请参阅调查:
M. Pauly、M. Gross 和 LP Kobbelt。点采样表面的有效简化。在 Visualization '02 会议记录中,第 163-170 页,华盛顿特区,2002 年。IEEE。
我认为您正在寻找“详细程度”算法。
一个简单的实现是将你的体积(表面)分解成一些子体积。从每个子卷中的点中,选择一个有代表性的点(例如最接近中心的点,或最接近平均值的点,或平均值等)。使用这些点来重绘你的表面。
您可以调整子卷的数量以动态增加/减少细节。
我会通过寻找对曲面曲率贡献很小的顶点(点)来解决这个问题。找到从每个顶点出现的所有边,并取它们对 (?) 的点积。代表非常浅的“山丘”的点将对向巨大的角度(接近 180 度)并具有小点积。
那些具有最小数字的顶点将成为移除的候选者。然后它们周围的顶点将形成一个平面。
或类似的东西。
除非您以某种方式对您的表面进行参数化,否则我不确定您如何确定哪些点携带相似的信息(因此可以丢弃)。
我想你可以随机选择一堆点来摆脱,但这听起来不像你想要做的。
也许彼此靠近的点(对于“靠近”的某些定义)可以被认为包含相似的信息,因此可以简化为每个此类组的单个代表。
你能提供更多细节吗?
在没有网格三角形和索引的约束的情况下简化点云更简单。
平滑和简化是不同的任务。为了简化云,您应该首先通过对您拥有的噪声类型、频率和方向特性进行配置来消除噪声伪影,并进行噪声配置比较类型减少。好的法线向量对此很有帮助。
这是一份关于使用 delauney、voronoi 和 k 最近邻数学进行 5-6 次简化的文档:
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.10.9640&rep=rep1&type=pdf
2008 年的更新版本: http ://www.wseas.us/e-library/transactions/research/2008/30-705.pdf
这是最近的 c++ 版本: https ://github.com/tudelft3d/masbcpp/blob/master/src/simplify.cpp