Open3D 半径滤波器
参考笔记:Open3D:理解与应用半径滤波器-CSDN博客
目录
一、算法原理
1.算法概述
2.计算过程
二、Open3D实现半径滤波器
一、算法原理
1.算法概述
半径滤波器:全称 Radius Outlier Removal ,是一种基于邻域密度的点云去噪方法。它的思路非常直接直接和简单,就是在点云数据中,该算法要求每一个点在一定的半径范围内至少有足够多的邻点,否则就会被当作噪声点移除
核心思想:有效点通常位于密度较高的区域,而噪声点往往孤立存在
2.计算过程
假设点云中有 n 个点,分别是
对点云中所有的点都要做以下算法流程:
① 邻域搜索
对点 ,搜索其半径
内的所有邻近点
② 密度判定
统计点 在该半径内的邻居点数量
③ 阈值过滤
若 ,则判定
为噪声点并移除。其中
为预设的最小邻居点数
🆗,以上就是半径滤波的整个算法流程,非常简单。在后续用 Open3D 实现算法时,只需要输入半径
和 最小邻居点阈值
即可
二、Open3D实现半径滤波器
Open3D 中实现点云半径滤波的函数是:
def remove_radius_outlier(self, nb_points, radius):
-
参数解析
-
nb_points:最小邻居点个数,也就是我们在前面的算法原理讲到的
-
radius: 半径
-
-
返回值解析
-
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("Radius Outlier Removal")filtered_pcd, inlier_indices = original_pcd.remove_radius_outlier(nb_points=16, #最小邻居点数radius=1) #半径r# 打印结果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)
运行结果(半径滤波前后效果对比):
可以看到,通过点云的半径滤波器,球形点云(有效数据)周围的噪声点很多都被移除掉了,效果还是不错的
🆗,以上就是本文的所有内容