Open3D 统计滤波器
参考笔记:Open3D: 去除3D点云离群点的统计滤波器-CSDN博客
目录
一、算法原理
1、算法概述
2、计算过程
二、Open3D 实现统计滤波器
一、算法原理
1、算法概述
点云统计滤波器,全称是Statistical Outlier Removal,是点云处理中最常用的去噪方法之一,用于去除明显的离群点。其核心思想是通过计算每个点与领域点的距离分布特征,剔除掉不符合统计规律的离群点,此去噪算法特别适合去除激光雷达或深度相机采集点云时所采集到的孤立噪点
如下所示,是使用统计滤波器前后的对比效果:
2、计算过程
假设点云中有 n 个点,分别是
① 邻域距离计算
对每个点 ,计算
与其
个最近邻点的平均距离
,公式如下:
点云中所有点经过运算后,可以得到 ,分别对应
② 全局统计特征
计算所有点的平均距离 的均值
和标准差
,公式如下:
③ 离群点判定
设定阈值为:
的点被视为是离群点,从点云中剔除该点
。其中参数
用来控制过滤的严格程度,通常取值为 1 ~ 3,值越小,过滤越严格,移除的点越多
🆗,以上就是统计过滤的整个算法流程,在后续用 Open3D 实现算法时,只需要输入邻居点
和 控制过滤严格程度的
即可
二、Open3D 实现统计滤波器
Open3D 中实现点云统计滤波的函数是:
def remove_statistical_outlier(self, nb_neighbors, std_ratio):
-
参数解析
-
nb_neighbors:邻点个数,也就是我们在前面的算法原理讲到的
-
std_ratio: 阈值
中的
-
-
返回值解析
-
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)
运行结果(滤波前后效果对比):
可以看到,通过点云的统计滤波器,球形点云(有效数据)周围的噪声点很多都被移除掉了 ,这也证明了统计滤波器用来移除离群点,作为一种去噪算法的有效之处
🆗,以上就是本文的所有内容