当前位置: 首页 > java >正文

Open3D 统计滤波器

参考笔记:Open3D: 去除3D点云离群点的统计滤波器-CSDN博客


目录

一、算法原理

1、算法概述

2、计算过程

二、Open3D 实现统计滤波器


一、算法原理

1、算法概述

点云统计滤波器,全称是Statistical Outlier Removal,是点云处理中最常用的去噪方法之一,用于去除明显的离群点。其核心思想是通过计算每个点与领域点的距离分布特征,剔除掉不符合统计规律的离群点,此去噪算法特别适合去除激光雷达或深度相机采集点云时所采集到的孤立噪点

如下所示,是使用统计滤波器前后的对比效果:


2、计算过程

假设点云中有 n 个点,分别是 \color{red}p_1=(x_1,y_1,z_1),.....,p_n=(x_n,y_n,z_n)

① 邻域距离计算

        对每个点 \color{red}p_i,计算 \color{red}p_i 与其 \color{red}k 个最近邻点的平均距离\color{red}d_i,公式如下:

{\color{red}d_i} = \frac{1}{k} \sum_{j = 1}^{k} \| p_i - p_j \|

        点云中所有点经过运算后,可以得到 \color{red}d_1,d_2,...,d_n ,分别对应 \color{red}p_1,p_2,...,p_n 

② 全局统计特征

        计算所有点的平均距离 \color{red}d_1,d_2,...,d_n 的均值 \mu 和标准差 \sigma,公式如下:

{\color{red}\mu} = \frac{1}{n} \sum_{i = 1}^{n} d_i \\ {\color{red}\sigma} = \sqrt{\frac{1}{n} \sum_{i = 1}^{n} (d_i - \mu)^2}

③ 离群点判定

        设定阈值为:\color{red}\tau = \mu + \alpha \;* \;\sigma

        \color{red}di>\tau 的点被视为是离群点,从点云中剔除该点 \color{red}p_i 。其中参数 \color{red}\alpha 用来控制过滤的严格程度,通常取值为 1 ~ 3,值越小,过滤越严格,移除的点越多

🆗,以上就是统计过滤的整个算法流程,在后续用 Open3D 实现算法时,只需要输入邻居点 \color{red}k 和 控制过滤严格程度的 \color{red}\alpha 即可

二、Open3D 实现统计滤波器

Open3D 中实现点云统计滤波的函数是:

def remove_statistical_outlier(self, nb_neighbors, std_ratio):
  • 参数解析

    • nb_neighbors:邻点个数,也就是我们在前面的算法原理讲到的 \color{red}k

    • std_ratio: 阈值 \tau = \mu + \alpha \;* \;\sigma 中的 \color{red}\alpha

  • 返回值解析

    • filtered_pcd: 保留的内点 (inliers) 构成的点云(已移除离群点)

    • inlier_indices:对应原始点云中,被保留为内点的点的索引

案例实现:

import open3d as o3d
import numpy as np# 生成含噪声的测试点云
def generate_test_data():# 生成球面点云,作为有效数据mesh_sphere = o3d.geometry.TriangleMesh.create_sphere(radius=1.0)mesh_sphere.compute_vertex_normals()sphere_pcd = mesh_sphere.sample_points_uniformly(number_of_points=500)# 添加一些随机噪声(离群点)noise_points = np.random.uniform(-3, 3, (100, 3))noise_pcd = o3d.geometry.PointCloud()noise_pcd.points = o3d.utility.Vector3dVector(noise_points)# 合并点云combined_pcd = sphere_pcd + noise_pcdreturn combined_pcdif __name__ == "__main__":# 生成测试数据original_pcd = generate_test_data()#可视化原始点云original_pcd.paint_uniform_color([1, 0, 0])  # 设置为红色o3d.visualization.draw_geometries([original_pcd], window_name="原始点云",width=1024, height=768,left=50, top=50,mesh_show_back_face=False)# 执行统计滤波print("Statistical Outlier Removal")filtered_pcd, inlier_indices = original_pcd.remove_statistical_outlier(nb_neighbors=20,  # 计算平均距离时考虑的邻域点数std_ratio=1.0  # 标准差倍数阈值)# 打印结果print(f"原始点云点数: {len(original_pcd.points)}")print(f"滤波后点云点数: {len(filtered_pcd.points)}")print(f"离群点的个数: {len(original_pcd.points) - len(filtered_pcd.points)}")# 可视化统计滤波之后的点云filtered_pcd.paint_uniform_color([1, 0, 0])  # 设置为红色o3d.visualization.draw_geometries([filtered_pcd], window_name="滤波点云",width=1024, height=768,left=50, top=50,mesh_show_back_face=False)

运行结果(滤波前后效果对比):

可以看到,通过点云的统计滤波器,球形点云(有效数据)周围的噪声点很多都被移除掉了 ,这也证明了统计滤波器用来移除离群点,作为一种去噪算法的有效之处

🆗,以上就是本文的所有内容

http://www.xdnf.cn/news/7994.html

相关文章:

  • RK3588 USB-OTG 功能使用记录
  • MAC系统安装node版本管理工具nvm
  • 条件随机场 (CRF) 原理及其在语义分割中的应用
  • 关于 Web 安全实践:4. 文件上传功能的风险分析与防护
  • 使用泛型服务基类简化Entity Framework对数据库访问逻辑
  • 基于JDBC的信息管理系统,那么什么是JDBC呢?什么又是DAO类?
  • Python输出与输入
  • windows服务器部署jenkins工具(二)
  • 在linux部署定时执行Kettle任务
  • 领麦微红外测温传感器:即热式饮水机测温应用
  • I.MX6U Mini开发板通过GPIO口测试光敏传感器
  • 无人机电子防抖技术要点概述!
  • 无人机集成毫米波雷达与双目视觉的融合感知系统深度解析
  • 全碳化硅功率模块开关瞬态特性及损耗研究
  • Java学习教程(附电子书资料50+册)
  • 多模态大模型
  • 将YOLO训练进程放至后台的方法-nohup
  • Oracle BUFFER CACHE内存不足的优化思路
  • 【信息系统项目管理师】第13章:项目资源管理 - 38个经典题目及详解
  • SEO关键词优化与长尾词布局
  • Powershell及命令行文章合集(不定期更新)
  • [Docker排查] 镜像拉取/容器启动/网络不通?Docker常见错误与解决方案
  • ERP 与 WMS 对接深度解析:双视角下的业务与技术协同
  • Linux系统之----文件及缓冲区
  • 实验4 插入数据
  • ETL工具部署的5个注意事项
  • 风车聊天室nodejs环境即可无需数据库
  • 适合初学者的 Blender和怎么下载 Blender格式模型
  • 项目优先级不清,如何合理分配资源?
  • Baumer工业相机堡盟工业相机的工业视觉如何进行药板缺陷检测