news 2026/4/16 9:20:16

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

作者头像

张小明

前端开发工程师

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

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(r"H:\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], axis=0) # 更新当前点的坐标 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, axis=0)) # 若点云中包含其他信息,如颜色、反射强度、法向量等,也需要删除。 # 下面以删除颜色为例:要保证点云中确实包含颜色信息,否则删除时会报错。 # pcd_filter.colors = o3d.utility.Vector3dVector(np.delete(np.asarray(pcd_mean.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_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], axis=0) # 更新当前点的坐标 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, axis=0)) # 若点云中包含其他信息,如颜色、反射强度、法向量等,也需要删除。 # 下面以删除颜色为例:要保证点云中确实包含颜色信息,否则删除时会报错。 # pointCloud_filter.colors = o3d.utility.Vector3dVector(np.delete(np.asarray(pcd_mean.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_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], 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/4/14 14:02:51

深度测评 8个一键生成论文工具:本科生毕业论文痛点全解析

深度测评 8个一键生成论文工具&#xff1a;本科生毕业论文痛点全解析 学术写作工具测评&#xff1a;为何需要一份靠谱的榜单&#xff1f; 随着人工智能技术的不断进步&#xff0c;越来越多的本科生开始依赖AI工具辅助毕业论文的撰写。然而&#xff0c;面对市场上种类繁多的一键…

作者头像 李华
网站建设 2026/4/6 16:08:04

AI一周大事盘点(2025年12月28日~2026年1月3日)

【摘要】2025年岁末至2026年新年伊始&#xff0c;全球AI产业展现出从“技术热点”向“系统性基础设施”深度融合的转型趋势。本周焦点集中于AI算力的硬件与能源创新&#xff0c;以OpenAI联手博通造芯和核能供电数据中心为代表。国内方面&#xff0c;政策治理持续细化&#xff0…

作者头像 李华
网站建设 2026/4/16 5:15:15

zotero7导入插件

从中文社区下载xpi 文件以后&#xff0c;直接导入就可以我们在抓取文献时&#xff0c;经常遇到标题全大写、首字母大小写不规范&#xff0c;或者缺省期刊缩写、大学地点格式不统一的情况。Linter for Zotero 是一个专门用于标准化这些信息的工具。它的核心功能是规范文献条目的…

作者头像 李华
网站建设 2026/4/13 17:46:59

springboot基于地图的智慧旅游景点推荐一体化服务系统vue

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

作者头像 李华
网站建设 2026/4/15 7:03:20

分布式计算:大数据领域的高性能解决方案

分布式计算&#xff1a;大数据领域的高性能解决方案 一、引言&#xff1a;当“大数据”遇到“计算瓶颈” 你有没有过这样的经历&#xff1f; 手里握着100GB的用户行为日志&#xff0c;想统计“每个用户的月活跃度”——用本地电脑跑Python脚本&#xff0c;3个小时过去了进度条…

作者头像 李华
网站建设 2026/4/13 17:19:58

华为OD机考双机位C卷 - 字符串计数匹配 (Java Python JS C/C++ GO )

最新华为OD机试 真题目录&#xff1a;点击查看目录 华为OD面试真题精选&#xff1a;点击立即查看 华为OD机考双机位C卷 题目描述 给你一个字符串str和整数k&#xff0c;返回满足以下条件的所有子字符串个数&#xff1a; 恰好包含k个字母。数字0-9各出现至少一次。 输入…

作者头像 李华