OPEN3D学习笔记(五)
- Point cloud outlier removal
- Prepare input data
- Select down sample
- Statistical outlier removal
- Radius outlier removal
Point cloud outlier removal
去除离群点
Prepare input data
准备输入数据:加载点云文件、进行下采样
1 2 3 4 5 6 7 | 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个点来对点云进行下采样。
1 2 3 | 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仅输出所选点。选定的点和未选定的点将可视化。
1 2 3 4 5 6 7 8 | 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允许基于跨点云的平均距离的标准偏差来设置阈值级别。此数字越低,过滤器将越具有攻击性。
1 2 3 | 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_outlier_removal会删除在给定球体中周围几乎没有邻居的点。可以使用两个参数将过滤器调整为数据:
nb_points使您可以选择球体应包含的最小点数
radius定义将用于计算邻居的球体的半径。
1 2 3 | 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) # 利用索引进行过滤显示 |