【Open3D】几何——点云离群点去除

作者 by Tianzhi Jia / 2022-05-11 / 暂无评论 / 355 个足迹

  • 当扫描设备收集数据时,生成的点云往往包含需要去除的噪声和伪影。本教程介绍了Open3D的离群点去除功能。

准备输入数据

  • 使用voxel_downsample加载点云并进行下采样。
print("Load a ply point cloud, print it, and render it")
sample_pcd_data = o3d.data.PCDPointCloud()
pcd = o3d.io.read_point_cloud(sample_pcd_data.path)
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])

  • 或者,使用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])

选择下采样

  • 以下帮助函数使用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])

统计离群点去除

  • 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)

半径离群点去除

  • 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)

独特见解