(2)点云库处理学习——剔除点云值

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)点云库处理学习——剔除点云值_第1张图片

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)参数定义

  1.  nb_neighbors : 目标点周围的点数。它指定考虑多少邻居来计算给定点的平均距离。
  2. std_ratio : std_ratio标准差比率。它允许根据跨点云的平均距离的标准偏差设置阈值级别。这个数字越低,过滤器就越激进。
  3. 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)点云库处理学习——剔除点云值_第2张图片

 2)左图的参数(20, 0.1)

(2)点云库处理学习——剔除点云值_第3张图片

 3)左图的参数(20, 0.01)

(2)点云库处理学习——剔除点云值_第4张图片

 4)左图参数(50, 0.1)

(2)点云库处理学习——剔除点云值_第5张图片

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)点云库处理学习——剔除点云值_第6张图片

 2)左图的统计滤波参数(20, 0.5),中间为原图,右侧半径滤波参数(10,2)

(2)点云库处理学习——剔除点云值_第7张图片

 3)左图的统计滤波参数(20, 0.5),中间为原图,右侧半径滤波参数(10,5)

(2)点云库处理学习——剔除点云值_第8张图片

你可能感兴趣的:(深度学习,学习)