Open3d之点云离群点剔除

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

数据预处理

加载点云并使用 voxel_downsample对其下采样。

# -*-coding:utf-8 -*-
import numpy as np
import open3d as o3d

# 加载点云
pcd = o3d.io.read_point_cloud("/home/ancy/Desktop/tradition/Open3D/examples/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])

# 使用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])

加载点云并可视化效果如下

 

Open3d之点云离群点剔除_第1张图片 

使用0.02米的体素下采样点云效果如下

Open3d之点云离群点剔除_第2张图片
或者,使用uniform_down_sample通过收集每第n个点来对点云进行下采样。

# 均匀地对输入点云下采样。采样按点的顺序排序,每5个点一组,始终选择第0个点,而不是随机的。
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])

Open3d之点云离群点剔除_第3张图片

选择下采样

select_by_index 函数通过二进制mask去只输出被选中的点。选中的点和未选中的点被可视化。

def display_inlier_outlier(cloud, ind):
    inlier_cloud = cloud.select_by_index(ind)
    outlier_cloud = cloud.select_by_index(ind, invert=True)
    # 选中的点为灰色,未选中点为红色
    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函数删除与点云的距离比起其他邻域的平均距离远的点,他有两个输入参数:

  • nb_neighbors:用于指定邻域点的数量,以便计算平均距离。
  • std_ratio:基于点云的平均距离的标准差来设置阈值。阈值越小,滤波效果越明显。
# 统计式离群点移除
cl, ind = voxel_down_pcd.remove_statistical_outlier(nb_neighbors=20,
                                                    std_ratio=2.0)
# 可视化
display_inlier_outlier(voxel_down_pcd, ind)

Open3d之点云离群点剔除_第4张图片

 

半径式离群点剔除

radius_outlier_removal 会删除在给定半径的球体周围几乎没有邻域点的点。他也有两个输入参数:

  • nb_points:选择球体中最少点的数量。
  • radius:用来计算点的邻域点的数量的球的半径。
# 半径式离群点剔除
cl, ind = voxel_down_pcd.remove_radius_outlier(nb_points=16, radius=0.05)
display_inlier_outlier(voxel_down_pcd, ind)

Open3d之点云离群点剔除_第5张图片

 

你可能感兴趣的:(open3d)