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

1、主要参考

1.1参考地址

(1)

点云离群点剔除 — open3d python_Coding的叶子的博客-优快云博客_离群点去除

(2)

open3d之点云异常值去除(笔记5)_Satellite_H的博客-优快云博客

(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的博客-优快云博客

 无效值包括空值和无限值。空值一般用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)左图的参数(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)

### 点云数据处理技术概述 点云数据处理涉及多种技术和方法,旨在对采集到的三维点云数据进行预处理、分析和优化。以下是几种常见的点云数据处理技术及其具体实现方式: #### 1. **体素滤波** 体素滤波是一种常用的点云降采样和平滑技术。它通过将点云划分为固定大小的立方体网格(即体素),并保留每个体素内的代表性点来减少点云密度[^1]。这种方法不仅能够有效降低点云数据量,还能平滑噪声点。PCL(Point Cloud Library)提供了便捷的API支持该功能。 ```cpp #include <pcl/filters/voxel_grid.h> void downsamplePointCloud(pcl::PointCloud<pcl::PointXYZ>::Ptr input_cloud, pcl::PointCloud<pcl::PointXYZ>::Ptr output_cloud, float leaf_size){ pcl::VoxelGrid<pcl::PointXYZ> voxel_filter; voxel_filter.setInputCloud(input_cloud); voxel_filter.setLeafSize(leaf_size, leaf_size, leaf_size); // 设置体素尺寸 voxel_filter.filter(*output_cloud); } ``` 此代码片段展示了如何利用PCL库执行体素滤波操作[^1]。 #### 2. **去噪算法** 点云通常包含大量噪声点,影响后续建模精度。因此,采用合适的去噪策略至关重要。一种常见的方式是基于统计学的方法——移除距离其邻域平均位置过远的孤立点[^2]。 ```cpp #include <pcl/filters/statistical_outlier_removal.h> void removeNoise(pcl::PointCloud<pcl::PointXYZ>::Ptr input_cloud, pcl::PointCloud<pcl::PointXYZ>::Ptr output_cloud, int mean_k, double std_dev_mul_thresh){ pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor; sor.setInputCloud (input_cloud); sor.setMeanK(mean_k); // 邻近点数量 sor.setStddevMulThresh(std_dev_mul_thresh); // 偏差阈 sor.filter (*output_cloud); } ``` 上述函数实现了基于统计模型的异常点剔除过程。 #### 3. **关键点检测** 类似于二维图像中的角点提取,在三维场景下也可以定义一些具有显著几何特性的“关键点”。这些点往往位于物体边界或者曲率变化剧烈处,能很好地表征整体结构特性[^3]。例如ISAF、ISS等都是针对点云设计的关键点探测器。 #### 4. **配准与拼接** 当获取多个视角下的部分视图时,需借助ICP(Iterative Closest Point)、NDT(Normal Distributions Transform)之类的全局或局部最优求解手段完成精确对接[^2]。 --- ### 工具推荐 对于实际开发而言,除了前面提到过的PCL外,还有其他几款优秀的软件平台可供选择: - **CloudCompare**: 开放式多功能可视化编辑环境; - **MeshLab**: 主要面向网格化后的三角形面片对象; - **Open3D**: 新兴跨平台框架,兼具高效性和易用性特点; --- ### 性能评估指标 评价一项特定算法效果的好坏可以从以下几个维度考量: - 数据压缩比率; - 运算耗时时长; - 几何保真度损失程度等等。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值