半径滤波
在给定阈值参数nb_points后,遍历点云所有点,对于点云中任意一点,设其半径radius内有K个点,当K< nb_points时,即可识别该点为噪声点,并去除该点。
pc,idx=pcd.remove_radius_outlier(nb_points, radius, print_progress=False)
nb_points:邻域球内的最少点个数,小于该个数为噪声点
radius: 邻域半径大小
pc:去噪后的点云
idx:去噪保留的点索引
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])
inlier_cloud.paint_uniform_color([0.8, 0.8, 0.8])
o3d.visualization.draw([inlier_cloud, outlier_cloud])
if __name__ == "__main__":
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((np.pi, 0, 0))
pcd.rotate(R, center=(0, 0, 0))
o3d.visualization.draw([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([voxel_down_pcd])
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)
统计滤波
当判断点的nb_neighbors近邻平均距离大于【平均距离+std_ratio*σ】,即判定为噪声点,σ为标准差
平均距离:遍历点云中的每个点到任意点距离的平均值。
pc,idx=pcd.remove_statistical_outlier( nb_neighbors, std_ratio, print_progress=False)
参数:
nb_neighbors:指nb_neighbors个最近点,我们需要计算距离该点nb_neighbors个最近点的平均距离
std_ratio:标准差的倍数
返回值:
pc: 去噪后的点云
idx: 去噪保留的点索引
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])
inlier_cloud.paint_uniform_color([0.8, 0.8, 0.8])
o3d.visualization.draw([inlier_cloud, outlier_cloud])
if __name__ == "__main__":
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((np.pi, 0, 0))
pcd.rotate(R, center=(0, 0, 0))
o3d.visualization.draw([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([voxel_down_pcd])
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)