news 2026/5/23 1:05:16

第十三课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/5/22 22:46:43

Leetcode 25. K 个一组翻转链表 JavaScript (Day 12)

js一刷自解 var reversefunction(node0,head,k){let rearhead;let curhead;for(let i0;i<k;i){let tempcur.next;let node1node0.next;node0.nextcur;cur.nextnode1;curtemp;}rear.nextcur;return[rear,cur]; }var reverseKGroup function(head, k) {let dummynew ListNod…

作者头像 李华
网站建设 2026/5/1 6:48:12

Leetcode 138. 随机链表的复制 (Day 12)

js 一刷 var copyRandomList function(head) {if (!head) return null;let map new Map();let cur head;while (cur) {map.set(cur, new ListNode(cur.val));cur cur.next;}cur head;while (cur) {let copy map.get(cur);copy.next map.get(cur.next) ?? null;copy.ra…

作者头像 李华
网站建设 2026/5/22 19:02:55

基于Java+SpringBoot的零售与仓储管理系统(源码+lw+部署文档+讲解等)

课题介绍 本课题聚焦零售行业与仓储管理脱节、库存周转效率低、订单处理流程繁琐、数据协同不及时等痛点&#xff0c;设计并实现一款基于JavaSpringBoot的零售与仓储管理系统&#xff0c;旨在打通零售端与仓储端数据链路&#xff0c;为企业提供一体化的经营管理解决方案。系统以…

作者头像 李华
网站建设 2026/5/14 1:03:06

深度学习计算机毕设之基于python的人脸识别系统设计与实现机器学习

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/5/22 10:31:56

springboot基于javaweb的大学生兼职管理系统vue签约

目录摘要开发技术核心代码参考示例1.建立用户稀疏矩阵&#xff0c;用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度总结源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;摘要 基于SpringBoot和Vue的大学生兼职管理系…

作者头像 李华
网站建设 2026/5/23 0:09:16

Java小白面试实录:从Spring Boot到微服务架构的技术探讨

场景描述 在某知名互联网大厂的会议室内&#xff0c;小白程序员“超好吃”正准备参加他人生中第一次Java开发岗的面试。面试官是一位看似严肃但经验丰富的技术专家。 第一轮提问&#xff1a;Spring Boot基础与应用 面试官&#xff1a;超好吃&#xff0c;你好&#xff01;首先请…

作者头像 李华