OPEN3D学习笔记(五)——Point cloud outlier removal

澹台博文
2023-12-01

Point cloud outlier removal

去除离群点

Prepare input data

准备输入数据:加载点云文件、进行下采样

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

辅助函数使用带二进制掩码的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])  # 可视化降采样的点、未被选中的点

Statistical outlier removal

基于统计学方法,高斯分布,适用于移除孤立点(离得很远的点)

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 outlier removal

以半径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)  # 利用索引进行过滤显示
 类似资料: