本文主要是介绍通俗描述,带图,最远点采样法FPS(Farthest Point Sampling),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
另一个描述: https://www.it610.com/article/1279200974338015232.htm
我自己对算法的描述:
每一次都选最远的点加入进来,这样能够使得所选的点足够分散并覆盖全部。
所以关键在于每次都要选最远的点。
1. 第一个点可以随便初始化
2. 第二点选最远的点
3. 第三个点该怎么选呢? 当然也是要选离第一个和第二个点都最远的点。我们可以让剩余的每个点都与 第一个点和第二个点计算距离,这会有两个距离值,选择最短的那个距离表示他们与这两个点的距离,因为这表示的就是剩下的这些点分别到已经被选的两个点的距离,从这些距离里面选距离值最大的点,也就是最远的那个点,这就能满足我们每次都选最远点的目的了。
4. 后续的点也按照第三步的方式进行,让剩余的点与之前选过的点都进行距离计算,然后选择距离最小的那个作为他们到已选点集的距离,最后再从这些距离值里面选择最大的那个,也就是最远的那个点,就可以了。
5. 重复上面的步骤,直到达到期望的采样点个数即可结束。
算法设计改进
在第三步和第四步中,每一次选择下一个点都需要计算剩下的点到已选的点的距离(剩下的点与所有已选点的距离中最小的那个距离),随着已选点数的增加,计算量会增长非常多,具体增长方式按照多项式O(n*(n-k))方式增长,在选取第n/2个采样点时计算量达到最大即(n^2)/2。但实际上,每次都要更新的那些剩下的点到已选点的最小的距离的主要原因是上一次添加的新的已选点,因为这个新点的加入使得所有的未选点的距离都需要更新,但是很明显这个更新不需要每次都那么"兴师动众"对所有已选点集合和未选点集合里面的任意两个点都算一遍,只需要在每次加入新点之后,让这个新点与剩下的所有点进行距离计算,如果这个距离相较新点之前时保存的距离值更小,那么更新这个剩下点所对应的距离值即可,如果并没有更小,那么就保持不变。这样就能够使得计算量大幅降低,使得在目前常用的点云数量上的采点速度得到提升,能够降低到O(kn),但如果数据量很大,选点很多,实际上还是O(n^2)。
这篇关于通俗描述,带图,最远点采样法FPS(Farthest Point Sampling)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!