离群点一般是指偏离大部分数据的点,可能是由于随机误差造成异常点。离群点剔除的方法有很多种,例如基于统计、邻近度、密度、方差等方法。这里主要介绍open3d中实现的三种点云离群点的剔除方法,包括无效值剔除、统计方法、半径滤波法。
无效值包括空值和无限值。空值一般用NaN表示。open3d中对应的剔除函数为remove_non_finite_points。当remove_nan为True时,剔除空值。当remove_infinite为True时表示去除无限值。
remove_non_finite_points(self, remove_nan=True, remove_infinite=True)
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 以打印进度条。
半径滤波离群点剔除是在指在目标点周围指定半径内统计点的数量,如果点的数量小于某一阈值则认为目标点是离群点并进行删除。因此,半径滤波剔除离群点方法的两个主要参数就是半径和点云数量阈值。
remove_radius_outlier(自我,nb_points,半径,print_progress = False)
删除给定半径的给定球体中小于 nb_points 的点的函数
参数
nb_points ( int ) – 半径内的点数。
radius ( float ) -- 球体的半径。
print_progress ( bool , optional , default=False ) – 设置为 True 以打印进度条。
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) # 窗口高度
灰色图片为原始点云,蓝色为open3d无效值剔除后结果,绿色为open3d为统计方法剔除结果,红色为半径滤波方法剔除结果。
python三维点云从基础到深度学习_Coding的叶子的博客-CSDN博客_3d点云 python从三维基础知识到深度学习,将按照以下目录持续进行更新。https://blog.csdn.net/suiyingy/article/details/124017716
更多三维、二维感知算法和金融量化分析算法请关注“乐乐感知学堂”微信公众号,并将持续进行更新。