1、主要参考
1.1参考地址
(1)
点云离群点剔除 — open3d python_Coding的叶子的博客-CSDN博客_离群点去除
(2)
open3d之点云异常值去除(笔记5)_Satellite_H的博客-CSDN博客
(3)斯坦福经典兔子的点云数据下载地址
下载地址
Model : Bunny
1.2兔子的实验
(1)代码
import open3d as o3d
import numpy as np
# from copy import deepcopy
# from matplotlib import pyplot as plt
path = "D:/RGBD_CAMERA/python_3d_process/bunny.ply"
pcd = o3d.io.read_point_cloud(path) # path为文件路径
# o3d.io.write_point_cloud("chenbunny.pcd",pcd) #可以保存数据,或者修改为其它格式的如pcd
o3d.visualization.draw_geometries([pcd])
(2)通过键盘的+和-可以控制点云大小,鼠标可以滚动视角
2、剔除的方法
2.1无效值剔除
详见我的上一篇blob
(1)点云库PCL学习——点云的格式、PCD文件的打开和显示_chencaw的博客-CSDN博客
无效值包括空值和无限值。空值一般用NaN表示。open3d中对应的剔除函数为
remove_non_finite_points。当remove_nan为True时,剔除空值。当remove_infinite为True时表示去除无限值。
2.2统计方式剔除
(1)函数的具体定义
remove_statistical_outlier(nb_neighbors,std_ratio,print_progress = False)
该函数用于删除距离其邻居较远的点
(2)参数定义
- nb_neighbors : 目标点周围的点数。它指定考虑多少邻居来计算给定点的平均距离。
- std_ratio : std_ratio标准差比率。它允许根据跨点云的平均距离的标准偏差设置阈值级别。这个数字越低,过滤器就越激进。
- print_progress : 为True时,可以显示处理进度 打印进度条
(3)测试代码
import open3d as o3d
import numpy as np
from copy import deepcopy
##--(1)去除无效值------------------
path = "D:/RGBD_CAMERA/python_3d_process/1_hezi.pcd"
pcd = o3d.io.read_point_cloud(path) # path为文件路径
# pcd.paint_uniform_color([0, 0, 1])#指定显示为蓝色
pcd = pcd.remove_non_finite_points(remove_nan = True, remove_infinite = False) #剔除无效值nan
##--(2)统计方法剔除-----------------
##--拷贝一波,对比一起显示--chen 20221129
pcd2 = deepcopy(pcd)
# pcd2.paint_uniform_color([1, 0, 0])#指定显示为蓝色
pcd2.translate((0, 800, 0)) #整体进行y轴方向平移
res2 = pcd2.remove_statistical_outlier(20, 0.5, print_progress = False)#统计方法剔除
# res2 = pcd2.remove_statistical_outlier(20, 0.1, print_progress = False)#统计方法剔除
# res2 = pcd2.remove_statistical_outlier(20, 0.01, print_progress = False)#统计方法剔除
# res2 = pcd2.remove_statistical_outlier(50, 0.1, print_progress = False)#统计方法剔除
pcd2 = res2[0] #返回点云,和点云索引
##--(3)显示一下-----------------
o3d.visualization.draw_geometries([pcd,pcd2], #点云列表
window_name="离群点剔除对比显示",
point_show_normal=False) # 窗口高度
# o3d.visualization.draw_geometries([pcd,pcd2], #点云列表
# window_name="离群点剔除对比显示",
# point_show_normal=False,
# width=800, # 窗口宽度
# height=600) # 窗口高度
(4)测试结果,
1)左图的参数(20, 0.5)
2)左图的参数(20, 0.1)
3)左图的参数(20, 0.01)
4)左图参数(50, 0.1)
2.3 半径滤波方式剔除
(1)函数
remove_radius_outlier(nb_points, radius,print_progress = False)
函数功能:删除给定半径的给定球体中小于 nb_points 的点的函数
(2)参数说明
nb_points (int):半径内的点数。它允许您选择球体应包含的最少点数
radius (float):球体半径。它定义了将用于计算邻居的球体的半径
print_progress (bool, optional, default=False):设置为 True 以打印进度条
(3)测试代码
(4)测试结果
1)左图的统计滤波参数(20, 0.5),中间为原图,右侧半径滤波参数(20,2)
2)左图的统计滤波参数(20, 0.5),中间为原图,右侧半径滤波参数(10,2)
3)左图的统计滤波参数(20, 0.5),中间为原图,右侧半径滤波参数(10,5)