当前位置: 首页 > news >正文

第十课Open3D点云数据处理:均值滤波

1 均值滤波原理

2 与中值滤波对比

3 均值滤波代码实现

3.1 代码行实现

3.2 将均值滤波的实现封装到函数 pointCloud_mean_filter() 中


1 均值滤波原理

点云均值滤波是将空间中每个点的值替换为其周围点的坐标平均值。具体来说,对于给定点云中的每个点,我们考虑它的邻域,即以该点为中心的一定大小的球体,然后计算该球体内所有点的坐标平均值,最后将该点的坐标值替换为该平均值。这个过程可以重复进行多次,以进一步平滑点云数据。点云均值滤波可以有效地去除噪声和平滑点云数据。

2 与中值滤波对比

  • 原理不同:均值滤波取平均值,中值滤波取中位数。
  • 滤波效果不同:均值滤波适用于去除较为平稳的噪声,能够在一定程度上对点云数据进行平滑处理,但会损失部分细节信息;中值滤波更适用于去除非均匀性噪声,能够保留更多的细节信息。
  • 适用范围不同:均值滤波适用于处理较小的噪声,窗口大小较小;中值滤波适用于处理较大的噪声,窗口大小较大。

3 均值滤波代码实现

# axis=0表示对点云取质心,返回一个三维坐标 mean = np.mean(np.asarray(pcd.points)[idx], axis=0)

3.1 代码行实现

import open3d as o3d import numpy as np # 读取点云文件 pcd = o3d.io.read_point_cloud(r"H:\HTempWK\temp\open3d\pointdata\feiji.pcd") # 定义均值滤波半径 radius = 0.05 # 构建kdtree进行邻域搜索 kdtree = o3d.geometry.KDTreeFlann(pcd) np_points = np.array(pcd.points) # 遍历点云 for i in range(len(pcd.points)): # 获取当前点的坐标 point = pcd.points[i] # 使用kdtree搜索当前点的邻域 [k, idx, _] = kdtree.search_radius_vector_3d(point, radius) # 如果邻域内没有点,则跳过 if k < 1: continue # 计算邻域内所有点的坐标平均值 mean = np.mean(np.asarray(pcd.points)[idx], axis=0) # 更新当前点的坐标 np_points[i] = mean # 创建点云对象,存放滤波结果 pcd_mean = o3d.geometry.PointCloud() pcd_mean.points = o3d.utility.Vector3dVector(np_points) # 打印点云信息 print('原始点云:',pcd) print('滤波点云:',pcd_mean) # 可视化滤波结果 pcd.paint_uniform_color([1,0,0]) pcd_mean.paint_uniform_color([0,1,0]) o3d.visualization.draw_geometries([pcd,pcd_mean], width=1200, height=800, window_name = '均值滤波-原始点云(红),滤波点云(绿)')

3.2 将均值滤波的实现封装到函数pointCloud_mean_filter()

import open3d as o3d import numpy as np """ @describe: 点云均值滤波 @param[I]: pointCloud, 待滤波点云 @param[I]: radius, 滤波窗口半径 @return: pointCloud_mean: 均值滤波结果点云 """ def pointCloud_mean_filter(pointCloud,radius): # 构建kdtree进行邻域搜索 kdtree = o3d.geometry.KDTreeFlann(pointCloud) np_points = np.array(pointCloud.points) # 遍历点云 for i in range(len(pointCloud.points)): # 获取当前点的坐标 point = pointCloud.points[i] # 使用kdtree搜索当前点的邻域 [k, idx, _] = kdtree.search_radius_vector_3d(point, radius) # 如果邻域内没有点,则跳过 if k < 1: continue # 计算邻域内所有点的坐标平均值 mean = np.mean(np.asarray(pcd.points)[idx], axis=0) # 更新当前点的坐标 np_points[i] = mean # 创建点云对象,存放滤波结果 pointCloud_mean= o3d.geometry.PointCloud() pointCloud_mean.points = o3d.utility.Vector3dVector(np_points) # 返回滤波结果点云 return pointCloud_mean if __name__ == "__main__": # 读取点云文件 pcd = o3d.io.read_point_cloud("data\desk.pcd") # 定义均值滤波窗口半径 radius = 0.05 # 创建点云对象,存放滤波结果 pcd_mean = o3d.geometry.PointCloud() # 执行均值滤波 pcd_mean = pointCloud_mean_filter(pcd,radius) # 打印点云信息 print('原始点云:',pcd) print('滤波点云:',pcd_mean) # 可视化滤波结果 pcd.paint_uniform_color([1,0,0]) pcd_mean.paint_uniform_color([0,1,0]) o3d.visualization.draw_geometries([pcd,pcd_mean], width=1200, height=800, window_name = '均值滤波-原始点云(红),滤波点云(绿)')
http://www.cnnetsun.cn/news/422938.html

相关文章:

  • 医疗健康领域的大数据运营:精准医疗的数据支撑
  • 前端考察【底层原理与浏览器内核】-浏览器渲染流水线
  • 基于定制开发开源AI智能名片S2B2C商城小程序的刚需类产品电商运营模式研究
  • 电脑配置流程(VR项目)
  • springboot学生学分学业预警管理系统vue
  • java基础-IO流(打印流)
  • AI应用架构师的智慧决策:AI驱动虚拟娱乐的战略规划
  • 【论文自动阅读】Dream2Flow: Bridging Video Generation and Open-World Manipulation with 3D Object Flow
  • 华为OD机试真题 - 支持优先级队列 (C++ Python JAVA JS GO)
  • 【Spring源码】getBean源码实战(七)——BeanPostProcessor与初始化方法
  • Java分页查询方式总结
  • Android 16安兔兔分辨率作假显示(非修改TextView方案)
  • typora快速下载(简单易学)
  • laravel的session_start(); 是在哪里调用的?
  • OpenAI重组团队开发语音AI硬件产品,2026年推出新模型
  • AI重塑工作格局:Mercor如何连接人才与智能体训练
  • Windows系统文件找不到的问题 如何下载文件修复?
  • 使用电脑Win系统时经常会出现丢失找不到某些文件的情况
  • 2024年五大颠覆性技术趋势
  • 托盘目标检测数据集VOC+YOLO格式4517张1类别
  • 大模型开发必备!一张图看懂AI Agent!五层架构深度剖析,从Prompt到Action的完整闭环
  • 未来已来!Android Studio的AI Agent让编程变得如此简单,开发者:这比antigravity还牛!小白也能秒变大神,不会你就真的out了!
  • springboot+vue电影推荐系统springboot协同过滤
  • 基于非对称纳什谈判的多微网电能共享运行优化:MATLAB 实现探秘
  • 笔记本外接屏突然黑屏?我踩了 3 个坑,最后靠回退 N 卡驱动救了急
  • 2025年APP开发公司口碑排行榜单权威发布
  • 开关电流降压型DC-DC转换器D7015解析
  • 网站没有安装SSL证书会有影响吗?
  • 学长亲荐9个AI论文网站,助你轻松搞定本科论文!
  • AI 把内容做成了 “泔水”,但你的 “人味儿” 正在变贵