news 2026/6/13 17:24:22

第十三课Open3D点云数据处理:半径-中值组合滤波

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
第十三课Open3D点云数据处理:半径-中值组合滤波

前言

2 代码实现

2.1 代码行实现

2.2 将半径-中值组合滤波实现封装到 pointCloud_radius_median_filter() 函数中


前言

第十一课Open3D点云数据处理:中值滤波-CSDN博客

第七课 Open3D点云数据处理:半径滤波-CSDN博客

2 代码实现

2.1 代码行实现

import open3d as o3d import numpy as np # 读取点云文件 pcd = o3d.io.read_point_cloud("data\desk.pcd") # 定义中值滤波半径 radius = 0.05 # 构建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 # 计算邻域内所有点的坐标中位数 median = np.median(np.asarray(pcd.points)[idx], axis=0) # 更新当前点的坐标 np_points[i] = median # 中值滤波:numpy数组转PointCloud点云 pcd_median = o3d.geometry.PointCloud() pcd_median.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_median.points), indices_to_delete, axis=0)) # 若点云中包含其他信息,如颜色、反射强度、法向量等,也需要删除。 # 下面以删除颜色为例:要保证点云中确实包含颜色信息,否则删除时会报错。 # pcd_filter.colors = o3d.utility.Vector3dVector(np.delete(np.asarray(pcd_median.colors), indices_to_delete, axis=0)) # 打印滤波前后点云 print('pcd',pcd) print('pcd_filter',pcd_filter) print('删除点数:',len(index_r)) # 可视化滤波结果 # 可视化滤波结果 pcd.paint_uniform_color([1,0,0]) o3d.visualization.draw_geometries([pcd], width=900, height=600, window_name = '半径-中值组合滤波:原始点云(红)') pcd_filter.paint_uniform_color([0,1,0]) o3d.visualization.draw_geometries([pcd_filter], width=900, height=600, window_name = '半径-中值组合滤波:滤波点云(绿)')

2.2 将半径-中值组合滤波实现封装到pointCloud_radius_median_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_median_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 # 计算当前点邻域内所有点的坐标中位数 median = np.median(np.asarray(pointCloud.points)[idx], axis=0) # 更新当前点的坐标 np_points[i] = median # 中值滤波:numpy数组转PointCloud点云 pointCloud_median = o3d.geometry.PointCloud() pointCloud_median.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_median.points), indices_to_delete, axis=0)) # 若点云中包含其他信息,如颜色、反射强度、法向量等,也需要删除。 # 下面以删除颜色为例:要保证点云中确实包含颜色信息,否则删除时会报错。 # pointCloud_filter.colors = o3d.utility.Vector3dVector(np.delete(np.asarray(pcd_median.colors), indices_to_delete, axis=0)) # 返回组合滤波点云 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_median_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], width=900, height=600, window_name = '半径-中值组合滤波:原始点云(红)') pcd_filter.paint_uniform_color([0,1,0]) o3d.visualization.draw_geometries([pcd_filter], width=900, height=600, window_name = '半径-中值组合滤波:滤波点云(绿)')
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/13 2:56:10

14.C++入门:vector|手撕vector

vector深度剖析及模拟实现 vector.h #pragma once #include<assert.h>namespace bit {template<class T>class vector{public:typedef T* iterator;typedef const T* const_iterator;vector(){}/*vector(const vector<T>& v){_start new T[v.capacity(…

作者头像 李华
网站建设 2026/6/5 3:54:07

技术文章大纲:Bug悬案侦破大会

c技术文章大纲&#xff1a;Bug悬案侦破大会背景与活动目的通过模拟真实开发中的复杂Bug场景&#xff0c;提升团队协作与问题排查能力结合案例分析&#xff0c;分享常见Bug类型及其背后的技术原理培养开发者系统性思维和逆向工程能力活动形式设计悬案设定&#xff1a;选取历史上…

作者头像 李华
网站建设 2026/6/8 11:13:20

MATLAB高效算法实战技术文章大纲1

MATLAB高效算法实战技术文章大纲核心优化策略向量化运算&#xff1a;避免循环&#xff0c;利用矩阵运算提升速度&#xff0c;例如 sum(A, 2)替代逐行求和循环。预分配内存&#xff1a;通过 zeros() 或 prealloc() 提前分配数组空间&#xff0c;减少动态扩容开销。内置函数优先&…

作者头像 李华
网站建设 2026/6/12 23:18:47

大规模语言模型在复杂系统非线性动态预测中的创新应用

大规模语言模型在复杂系统非线性动态预测中的创新应用关键词&#xff1a;大规模语言模型、复杂系统、非线性动态预测、创新应用、人工智能摘要&#xff1a;本文深入探讨了大规模语言模型在复杂系统非线性动态预测中的创新应用。首先介绍了研究的背景、目的、预期读者等内容&…

作者头像 李华