点云离群点剔除 — open3d python

        离群点一般是指偏离大部分数据的点,可能是由于随机误差造成异常点。离群点剔除的方法有很多种,例如基于统计、邻近度、密度、方差等方法。这里主要介绍open3d中实现的三种点云离群点的剔除方法,包括无效值剔除、统计方法、半径滤波法。

1 无效值剔除

        无效值包括空值和无限值。空值一般用NaN表示。open3d中对应的剔除函数为remove_non_finite_points。当remove_nan为True时,剔除空值。当remove_infinite为True时表示去除无限值。

remove_non_finite_points(self, remove_nan=True, remove_infinite=True)

2 统计方式剔除

        open3d中基于统计的方式剔除点云中离群点的函数是remove_statistical_outlier。该函数含有三个参数。第一个参数nb_neighbors是目标点的相邻点个数。std_ratio是标准差。该离群点剔除方法是指。在一个点周围选择若干个点,计算它们距离的统计参数,如果某个点偏离平均值超过stdio_ratio倍的方差则认为是离群点,并进行删除。std_ratio实际上是指偏离标准差的倍数。因此,这种方法也可以称为邻域滤波。第三个参数print_progress为True时,可以显示处理进度。

remove_statistical_outlier(nb_neighbors,std_ratio,print_progress = False)
参数
nb_neighbors ( int ) -- 目标点周围的邻居数。
std_ratio ( float ) – 标准偏差比率。
print_progress ( bool , optional , default=False ) – 设置为 True 以打印进度条。

3 半径滤波方式剔除

        半径滤波离群点剔除是在指在目标点周围指定半径内统计点的数量,如果点的数量小于某一阈值则认为目标点是离群点并进行删除。因此,半径滤波剔除离群点方法的两个主要参数就是半径和点云数量阈值。

remove_radius_outlier(自我,nb_points,半径,print_progress = False)
删除给定半径的给定球体中小于 nb_points 的点的函数
参数
nb_points ( int ) – 半径内的点数。
radius ( float ) -- 球体的半径。
print_progress ( bool , optional , default=False ) – 设置为 True 以打印进度条。

 4 python open3d 离群点剔除 

        pcd文件请参考:pcd格式点云样例文件-深度学习文档类资源-CSDN下载。

# -*- coding: utf-8 -*-
"""
乐乐感知学堂公众号
@author: https://blog.csdn.net/suiyingy
"""

import open3d as o3d
from copy import deepcopy
import numpy as np


if __name__ == '__main__':
    file_path = 'rabbit.pcd'
    pcd = o3d.io.read_point_cloud(file_path)
    pcd = pcd.uniform_down_sample(50)#每50个点采样一次
    pcd.paint_uniform_color([0.5, 0.5, 0.5])#指定显示为灰色
    print(pcd)

    #剔除无效值
    pcd1 = deepcopy(pcd)
    pcd1.paint_uniform_color([0, 0, 1])#指定显示为蓝色
    pcd1.translate((20, 0, 0)) #整体进行x轴方向平移
    pcd1 = pcd1.remove_non_finite_points(True, True)#剔除无效值
    print(pcd1)

    #统计方法剔除
    pcd2 = deepcopy(pcd)
    pcd2.paint_uniform_color([0, 1, 0])#指定显示为蓝色
    pcd2.translate((-20, 0, 0)) #整体进行x轴方向平移
    res = pcd2.remove_statistical_outlier(20, 0.5)#统计方法剔除
    pcd2 = res[0]#返回点云,和点云索引
    print(pcd2)

    #半径方法剔除
    pcd3 = deepcopy(pcd)
    pcd3.paint_uniform_color([1, 0, 0])#指定显示为蓝色
    pcd3.translate((0, 20, 0)) #整体进行y轴方向平移
    res = pcd3.remove_radius_outlier(nb_points=20, radius=2)#半径方法剔除
    pcd3 = res[0]#返回点云,和点云索引
    print(pcd3)

    # # 点云显示
    o3d.visualization.draw_geometries([pcd, pcd1, pcd2, pcd3], #点云列表
                                      window_name="离群点剔除",
                                      point_show_normal=False,
                                      width=800,  # 窗口宽度
                                      height=600)  # 窗口高度

5 点云剔除效果

        灰色图片为原始点云,蓝色为open3d无效值剔除后结果,绿色为open3d为统计方法剔除结果,红色为半径滤波方法剔除结果。

点云离群点剔除 — open3d python_第1张图片

python三维点云从基础到深度学习_Coding的叶子的博客-CSDN博客_3d点云 python从三维基础知识到深度学习,将按照以下目录持续进行更新。https://blog.csdn.net/suiyingy/article/details/124017716

 更多三维、二维感知算法和金融量化分析算法请关注“乐乐感知学堂”微信公众号,并将持续进行更新。

你可能感兴趣的:(三维点云,python,离群点,离群点剔除,点云,open3d,python)