目录
1.2 point_cloud_outlier_removal_radius.py
2. point_cloud_outlier_removal_statistical.py
1. remove_radius_outlier
通过半径和个数阈值,控制。
以当前点为中心,在球体给定范围内,如果点个数少于阈值nb_points,则删除该点。
1.1 关键代码:
下采样:
voxel_down_pcd = pcd.voxel_down_sample(voxel_size=0.02) # pcd: PointCloud
或者uniform_down_sample
删除离群点:
cl, ind = voxel_down_pcd.remove_radius_outlier(nb_points=16, radius=0.05) # cl: PointCloud. ind: 处理后idx list
点云提取:
# indices (List[int]): Indices of vertices to be selected. outlier_cloud = cloud.select_by_index(ind, invert=True) # 反向提取
1.2 point_cloud_outlier_removal_radius.py
import open3d as o3d
import numpy as np
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]) # red
inlier_cloud.paint_uniform_color([0.8, 0.8, 0.8])
o3d.visualization.draw([inlier_cloud, outlier_cloud])
if __name__ == "__main__":
# 1. read pcd
ptcloud_data = o3d.data.PLYPointCloud()
print("Load a ply point cloud, print it, and render it")
pcd = o3d.io.read_point_cloud(ptcloud_data.path)
R = pcd.get_rotation_matrix_from_xyz(rotation=(np.pi, 0, 0)) # xyz: list. R: array(3,3)
pcd.rotate(R=R, center=(0, 0, 0))
o3d.visualization.draw([pcd])
# 2. downsample
print("Downsample the point cloud with a voxel of 0.02")
voxel_down_pcd = pcd.voxel_down_sample(voxel_size=0.02) # pcd: PointCloud
o3d.visualization.draw([voxel_down_pcd])
# 3. remove稀疏点/离群点
print("Radius oulier removal")
"""
Removes points that have neighbors less than nb_points in a sphere of a given radius
以当前点为中心,在球体给定范围内,如果点个数少于阈值nb_points,则删除该点。
"""
cl, ind = voxel_down_pcd.remove_radius_outlier(nb_points=16, radius=0.05) # cl: PointCloud. ind: 处理后idx list
# view
display_inlier_outlier(voxel_down_pcd, ind) # ind: idx list
下采样:
红色为离群点:
2. point_cloud_outlier_removal_statistical.py
通过标准差和个数控制。
Removes points that are further away from their neighbors in average.
预处理和前面的一样。
# 3. remove outlier
"""
Removes points that are further away from their neighbors in average.
nb_neighbors (int): Number of neighbors around the target point.
std_ratio (float): Standard deviation ratio. 标准差(标准偏差/均方差)
"""
print("Statistical oulier removal")
cl, ind = voxel_down_pcd.remove_statistical_outlier(nb_neighbors=20,
std_ratio=2.0)