我对最远点采样的理解如下如下:
- 初始点选择:从点云中随机选择一个初始点作为第一个采样点。
- 距离计算:对于每一个新采样点,计算其与所有未采样点之间的距离。
- 选择最远点:在每一步中,选择所有未采样点与当前采样点集最远的点作为新的采样点。
- 重复步骤2和3:直到采样到所需数量的点。
def farthest_point_sample_error(point, npoint):
"""
最远点采样算法
Args:
point: 点云数据,形状为[N, D]
npoint: 采样点的数量
Returns:
centroids: 采样点的索引,形状为[npoint, D]
"""
N, D = point.shape # 获取点云数据的形状
xyz = point[:, :3] # 获取点云数据的前三列,即坐标信息
centroids = np.zeros((npoint,)) # 初始化采样点索引
distance = np.ones((N,)) * 1e10 # 初始化距离数组,所有值为无穷大
farthest = np.random.randint(0, N) # 随机选择一个初始点
for i in range(npoint):
centroids[i] = farthest # 将当前点加入采样点集合
centroid = xyz[farthest, :] # 获取当前点的坐标
over = (xyz - centroid)**2
dist = np.sum(over, -1) # 计算所有点到当前点的距离
mask = dist < distance # 找到 当前点到各个点之间的距离 小于 上一个点到各个点之间的距离 的点
distance[mask] = dist[mask] # 更新距离数组
farthest = np.argmax(distance, -1) # 选择距离最远的点作为新的最远点
point = point[centroids.astype(np.int32)] # 根据索引选择采样点
return point # 返回采样后的点云数据
如果对于A,B,C,D这样四个点,坐标如下
[0, 3], [1, 3], [4, 0], [0, 0]或者 [0, 3, 0], [1, 3, 0], [4, 0, 0], [0, 0, 0]
若是,从A点开始采样3个点
····按照上面的算法····
初始距离数组=[+∞,+∞,+∞,+∞]
A_toABCD=[0,1,5,3],距离数组==[0,1,5,3],所以第二采样点是C
C_toABCD=[5,;0;
],距离数组==[0,1,0,3],所以第三采样点是D
····按照我的理解····
A_toA=0;A_toB=1;A_toC=5,A_toD=3;所以第二采样点是C
C_toA为重复;C_toB=;C_toC=0;C_toD=
,第三采样点应该是B
所以是我的理解错了吗
还请不吝赐教留下评论,在此甚是感谢!!!