最远点采样(Farthest Point Sampling)是一种非常常用的采样算法,由于能够保证对样本的均匀采样,被广泛使用.
一句话概括就是不断迭代地选择距离已有采样点集合的最远点。
FPS算法原理:
- 输入点云有N个点,从点云中选取一个点P0作为起始点,得到采样点集合S={P0};
- 计算所有点到P0的距离,构成N维数组L,从中选择最大值对应的点作为P1,更新采样点集合S={P0,P1};
- 计算所有点到P1的距离,对于每一个点Pi,其距离P1的距离如果小于L[i],则更新L[i] = d(Pi, P1),因此,数组L中存储的一直是每一个点到采样点集合S的最近距离;
- 选取L中最大值对应的点作为P2,更新采样点集合S={P0,P1,P2};
- 重复2-4步,一直采样到N’个目标采样点为止。
代码实现如下:
import open3d as o3d
import numpy as np
olderr = np.seterr(all='ignore')
def farthest_point_sample(point, npoint):
N, D = point.shape
xyz = point[:,:3]
centroids = np.zeros((npoint,))
distance = np.ones((N,)) * 1e10
farthest = np.random.r