2026/4/18 12:49:33
网站建设
项目流程
视频下载网站免费,潍坊网站建设哪家好,帝国cms官网,郑州百度网站推广1 半径-均值组合滤波算法原理
1.1 半径滤波原理
1.2 均值滤波原理
2 代码实现
2.1 代码行实现
2.2 将半径-均值组合滤波实现封装到 pointCloud_radius_mean_filter() 函数中 1 半径-均值组合滤波算法原理
1.1 半径滤波原理 1.2 均值滤波原理 需要注意的一点是#xff1a…1 半径-均值组合滤波算法原理1.1 半径滤波原理1.2 均值滤波原理2 代码实现2.1 代码行实现2.2 将半径-均值组合滤波实现封装到 pointCloud_radius_mean_filter() 函数中1 半径-均值组合滤波算法原理1.1 半径滤波原理1.2 均值滤波原理需要注意的一点是均值滤波后点云中点的总数并不会发生变化只是点的位置发生改变。2 代码实现2.1 代码行实现import open3d as o3d import numpy as np # 读取点云文件 pcd o3d.io.read_point_cloud(rH:\HTempWK\temp\open3d\pointdata\Armadillo\Armadillo.pcd) # 定义均值滤波半径 radius 0.5 # 构建kdtree进行邻域搜索 kdtree o3d.geometry.KDTreeFlann(pcd) np_points np.array(pcd.points) # 存放半径滤波过滤掉的点的索引 index_r [] # 遍历点云 for i in range(len(pcd.points)): # 获取当前点的坐标 point pcd.points[i] # 使用kdtree搜索当前点的邻域 [k, idx, _] kdtree.search_radius_vector_3d(point, radius) # 如果邻域内没有点则跳过并记录当前点索引 if k 20: # 将当前点索引添加到index_r数组中 index_r.append(i) continue # 计算邻域内所有点的坐标平均值 mean np.mean(np.asarray(pcd.points)[idx], axis0) # 更新当前点的坐标 np_points[i] mean # 均值滤波numpy数组转PointCloud点云 pcd_mean o3d.geometry.PointCloud() pcd_mean.points o3d.utility.Vector3dVector(np_points) # 将索引转换为numpy数组 indices_to_delete np.asarray(index_r) # 构建存放组合滤波点云的容器pcd_filter pcd_filter o3d.geometry.PointCloud() # 从点云中删除指定索引的点相当于半径滤波 pcd_filter .points o3d.utility.Vector3dVector(np.delete(np.asarray(pcd_mean.points), indices_to_delete, axis0)) # 若点云中包含其他信息如颜色、反射强度、法向量等也需要删除。 # 下面以删除颜色为例要保证点云中确实包含颜色信息否则删除时会报错。 # pcd_filter.colors o3d.utility.Vector3dVector(np.delete(np.asarray(pcd_mean.colors), indices_to_delete, axis0)) # 打印滤波前后点云 print(pcd,pcd) print(pcd_filter,pcd_filter) print(删除点数,len(index_r)) pcd.paint_uniform_color([1,0,0]) o3d.visualization.draw_geometries([pcd], width900, height600, window_name 半径-均值组合滤波原始点云红) pcd_filter.paint_uniform_color([0,1,0]) o3d.visualization.draw_geometries([pcd_filter], width900, height600, window_name 半径-均值组合滤波滤波点云绿)2.2 将半径-均值组合滤波实现封装到pointCloud_radius_mean_filter()函数中import open3d as o3d import numpy as np describe: 半径-均值组合滤波 param[I]: pointCloud, 待滤波点云 param[I]: radius, 滤波窗口半径 param[I]: min_ptNum, 半径滤波最小点数 return: pointCloud_filter: 组合滤波结果点云 def pointCloud_radius_mean_filter(pointCloud,radius,min_ptNum): # 构建kdtree进行邻域搜索 kdtree o3d.geometry.KDTreeFlann(pointCloud) np_points np.array(pointCloud.points) # 存放半径滤波过滤掉的点的索引 index_r [] # 遍历点云 for i in range(len(pointCloud.points)): # 获取当前点的坐标 point pointCloud.points[i] # 使用kdtree搜索当前点的邻域 [k, idx, _] kdtree.search_radius_vector_3d(point, radius) # 如果邻域内没有点则跳过并记录当前点的索引 if k min_ptNum: # 将当前点索引添加到index_r数组中 index_r.append(i) continue # 计算当前点邻域内所有点的坐标平均值 mean np.mean(np.asarray(pointCloud.points)[idx], axis0) # 更新当前点的坐标 np_points[i] mean # 均值滤波numpy数组转PointCloud点云 pointCloud_mean o3d.geometry.PointCloud() pointCloud_mean.points o3d.utility.Vector3dVector(np_points) # 将索引转换为numpy数组 indices_to_delete np.asarray(index_r) # 构建存放组合滤波点云的容器pointCloud_filter pointCloud_filter o3d.geometry.PointCloud() # 从点云中删除指定索引的点相当于半径滤波 pointCloud_filter.points o3d.utility.Vector3dVector(np.delete(np.asarray(pointCloud_mean.points), indices_to_delete, axis0)) # 若点云中包含其他信息如颜色、反射强度、法向量等也需要删除。 # 下面以删除颜色为例要保证点云中确实包含颜色信息否则删除时会报错。 # pointCloud_filter.colors o3d.utility.Vector3dVector(np.delete(np.asarray(pcd_mean.colors), indices_to_delete, axis0)) # 返回组合滤波点云 return pointCloud_filter if __name__ __main__: # 读取点云文件 pcd o3d.io.read_point_cloud(data\desk.pcd) # 定义均值滤波半径 radius 0.05 # 半径滤波最小点数 min_ptNum 20 # 执行组合滤波 pcd_filter pointCloud_radius_mean_filter(pcd,radius,min_ptNum) # 打印滤波前后点云 print(pcd,pcd) print(pcd_filter,pcd_filter) # 可视化滤波结果 pcd.paint_uniform_color([1,0,0]) o3d.visualization.draw_geometries([pcd], width900, height600, window_name 半径-均值组合滤波原始点云红) pcd_filter.paint_uniform_color([0,1,0]) o3d.visualization.draw_geometries([pcd_filter], width900, height600, window_name 半径-均值组合滤波滤波点云绿)