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

 下采样:

红色为离群点: 

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)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值