去除离群点
准备输入数据:加载点云文件、进行下采样
print("Load a ply point cloud, print it, and render it")
pcd = o3d.io.read_point_cloud("../../TestData/ICP/cloud_bin_2.pcd") # 加载点云
o3d.visualization.draw_geometries([pcd]) # 可视化,渲染
print("Downsample the point cloud with a voxel of 0.02")
voxel_down_pcd = pcd.voxel_down_sample(voxel_size=0.02) # 下采样,大小为2cm
o3d.visualization.draw_geometries([voxel_down_pcd]) # 可视化降采样后的结果
为了进行比较,uniform_down_sample可以通过收集每第n个点来对点云进行下采样。
print("Every 5th points are selected")
uni_down_pcd = pcd.uniform_down_sample(every_k_points=5) # 每5个点采样一次(根据点索引来降采样,而不是随机,也不是用什么距离来判断 )
o3d.visualization.draw_geometries([uni_down_pcd])
辅助函数使用带二进制掩码的select_down_sample仅输出所选点。选定的点和未选定的点将可视化。
def display_inlier_outlier(cloud, ind):
inlier_cloud = cloud.select_by_index(ind)
outlier_cloud = cloud.select_by_index(ind, invert=True) # invert利用索引反选
print("Showing outliers (red) and inliers (gray): ")
outlier_cloud.paint_uniform_color([1, 0, 0])
inlier_cloud.paint_uniform_color([0.8, 0.8, 0.8])
o3d.visualization.draw_geometries([inlier_cloud, outlier_cloud]) # 可视化降采样的点、未被选中的点
基于统计学方法,高斯分布,适用于移除孤立点(离得很远的点)
remove_statistical_outlier会删除与点云的平均值相比更远离其邻居的点。它带有两个输入参数:
nb_neighbors允许指定要考虑多少个邻居,以便计算给定点的平均距离。
std_ratio允许基于跨点云的平均距离的标准偏差来设置阈值级别。此数字越低,过滤器将越具有攻击性。
print("Statistical oulier removal")
cl, ind = voxel_down_pcd.remove_statistical_outlier(nb_neighbors=20, std_ratio=2.0) # 返回pointcloud和索引
display_inlier_outlier(voxel_down_pcd, ind) # 利用索引进行过滤显示
以半径radius生成的圆,邻居的数目低于阈值则被移除。适用于移除稀疏的点云
radius_outlier_removal会删除在给定球体中周围几乎没有邻居的点。可以使用两个参数将过滤器调整为数据:
nb_points使您可以选择球体应包含的最小点数
radius定义将用于计算邻居的球体的半径。
print("Radius oulier removal")
cl, ind = voxel_down_pcd.remove_radius_outlier(nb_points=16, radius=0.05) # 半径5cm内至少要有16个点
display_inlier_outlier(voxel_down_pcd, ind) # 利用索引进行过滤显示