Open3d(进阶一)——点云离群点移除

亲测代码程序可运行使用,open3d版本0.13.0。

open3d数据资源下载:GitHub - Cobotic/Open3D: Open3D: A Modern Library for 3D Data Processing

代码执行功能有:数据预处理、选择点、统计式离群点移除、半径式移除点移除,详情请见代码。

'''
Author: dongcidaci
Date: 2021-09-13 15:32:28
LastEditTime: 2021-09-13 15:37:16
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \open3d_code\01_2_pointcloudyichu.py
'''
import open3d as o3d
import numpy as np

#点云离群点移除

#数据预处理
#使用 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])
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])

#选择点
#select_down_sample 函数通过二进制mask去只输出被选中的点。选中的点和未选中的点被可视化。
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])

#统计式离群点移除
#statistical_outlier_removal函数删除与点云的距离比起其他邻域的平均距离远的点,他有两个输入参数:
#1.nb_neighbors:用于指定邻域点的数量,以便计算平均距离。
#2.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)

你可能感兴趣的:(open3d,python,3d)