open3d 删除稀疏点, 噪声点/离群点(outlier)

目录

1. remove_radius_outlier

1.1 关键代码:

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

open3d 删除稀疏点, 噪声点/离群点(outlier)_第1张图片

 下采样:

open3d 删除稀疏点, 噪声点/离群点(outlier)_第2张图片

红色为离群点: 

open3d 删除稀疏点, 噪声点/离群点(outlier)_第3张图片

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)

open3d 删除稀疏点, 噪声点/离群点(outlier)_第4张图片

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