半径滤波器比较简单粗暴。以某点为中心画一个圆计算落在该圆中点的数量,当数量大于给定值时,则保留该点,数量小于给定值则剔除该点。此算法运行速度快,依序迭代留下的点一定是最密集的,但是圆的半径和圆内点的数目都需要人工指定;
radius_outlier_removal 实现半径滤波算法,移除给定球体中几乎没有邻居的点。需要两个参数:
# @describe:可视化半径滤波后的结果点云和噪声点云
# @param:cloud,原始点云
# @param:ind,内点索引
def display_inlier_outlier(cloud, ind):
# 提取滤波后的结果点云
inlier_cloud = cloud.select_by_index(ind)
# 提取噪声点云
outlier_cloud = cloud.select_by_index(ind, invert=True)
# 结果展示
print("Showing outliers (red) and inliers (blue): ")
outlier_cloud.paint_uniform_color([1, 0, 0])
inlier_cloud.paint_uniform_color([0, 0, 1])
o3d.visualization.draw_geometries([inlier_cloud, outlier_cloud])