【小白深度教程 1.21】手把手教你使用 Open3D(4)去除点云数据中的噪声点(离散点)

【小白深度教程 1.21】手把手教你使用 Open3D(4)去除点云数据中的噪声点(离散点)

在这里插入图片描述

1. 点云离群点去除的概念

在使用扫描设备采集数据时,生成的点云往往包含噪声和伪影,这些都是我们希望去除的。本教程介绍了 Open3D 的离群点去除功能。

2. 准备输入数据

加载点云并使用 voxel_downsample 进行降采样。

print("Load a ply point cloud, print it, and render it")
pcd = o3d.io.read_point_cloud("../../test_data/ICP/cloud_bin_2.pcd")
o3d.visualization.draw_geometries([pcd],
                                  zoom=0.3412,
                                  front=[0.4257, -0.2125, -0.8795],
                                  lookat=[2.6172, 2.0475, 1.532],
                                  up=[-0.0694, -0.9768, 0.2024])

print("Downsample the point cloud with a voxel of 0.02")
voxel_down_pcd = pcd.voxel_down_sample(voxel_size=0.02)
o3d.visualization.draw_geometries([voxel_down_pcd],
                                  zoom=0.3412,
                                  front=[0.4257, -0.2125, -0.8795],
                                  lookat=[2.6172, 2.0475, 1.532],
                                  up=[-0.0694, -0.9768, 0.2024])

在这里插入图片描述
使用体素大小为 0.02 对点云进行降采样。

在这里插入图片描述

或者,可以使用 uniform_down_sample 通过采集每第 n 个点对点云进行降采样。

print("Every 5th points are selected")
uni_down_pcd = pcd.uniform_down_sample(every_k_points=5)
o3d.visualization.draw_geometries([uni_down_pcd],
                                  zoom=0.3412,
                                  front=[0.4257, -0.2125, -0.8795],
                                  lookat=[2.6172, 2.0475, 1.532],
                                  up=[-0.0694, -0.9768, 0.2024])

在这里插入图片描述

3. 选择降采样

以下辅助函数使用 select_by_index ,该函数接受一个二进制掩码,仅输出被选择的点。选中的点和未选中的点会被分别可视化。

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 (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],
                                      zoom=0.3412,
                                      front=[0.4257, -0.2125, -0.8795],
                                      lookat=[2.6172, 2.0475, 1.532],
                                      up=[-0.0694, -0.9768, 0.2024])

4. 统计离群点去除

statistical_outlier_removal 方法用于移除比点云平均距离更远的点。它接受两个输入参数:

  • nb_neighbors :指定在计算给定点的平均距离时考虑的邻居数量。
  • std_ratio :允许根据点云中平均距离的标准偏差设置阈值水平。该值越低,过滤器越激进。
print("Statistical oulier removal")
cl, ind = voxel_down_pcd.remove_statistical_outlier(nb_neighbors=20,
                                                    std_ratio=2.0)
display_inlier_outlier(voxel_down_pcd, ind)

在这里插入图片描述

5. 半径离群点去除

radius_outlier_removal 方法用于移除在给定球体范围内邻居较少的点。可以使用以下两个参数来调整过滤器以适应您的数据:

  • nb_points :指定球体内应包含的最小点数。
  • radius :定义用于计数邻居的球体半径。
print("Radius oulier removal")
cl, ind = voxel_down_pcd.remove_radius_outlier(nb_points=16, radius=0.05)
display_inlier_outlier(voxel_down_pcd, ind)

在这里插入图片描述

>