news 2026/1/16 4:35:52

第十二课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/1/12 4:58:22

医疗健康领域的大数据运营:精准医疗的数据支撑

医疗健康领域的大数据运营&#xff1a;精准医疗的数据支撑关键词&#xff1a;医疗大数据、精准医疗、数据运营、健康管理、生物信息学、数据挖掘、临床决策支持摘要&#xff1a;本文以“医疗健康领域的大数据运营如何支撑精准医疗”为核心&#xff0c;通过生活化的类比和技术细…

作者头像 李华
网站建设 2026/1/14 3:34:23

前端考察【底层原理与浏览器内核】-浏览器渲染流水线

1. 浏览器的渲染流水线(Parse -> Style -> Layout -> Paint -> Composite )中,哪些操作会触发重排(Reflow)?如何通过底层原理设计极致的渲染性能优化方案?请结合具体场景说明。 核心答案框架 渲染流水线阶段: Parse(解析) -> Style(计算样式) -> …

作者头像 李华
网站建设 2026/1/15 10:01:07

电脑配置流程(VR项目)

一、关闭防火墙等鼠标右击 右下角网络图标—Windows防火墙—关闭局域网络、关闭专用网络、关闭公用网络&#xff1b;鼠标点击”病毒和威胁防护“—管理设置—关闭实时保护、关闭云提供的保护、关闭自动提交样本、关闭篡改防护&#xff1b;二、将”PICO 4 Ultra 一体机初次使用说…

作者头像 李华
网站建设 2026/1/15 16:40:19

springboot学生学分学业预警管理系统vue

目录系统概述技术架构核心功能创新点应用价值开发技术核心代码参考示例1.建立用户稀疏矩阵&#xff0c;用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度总结源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;系统概述 …

作者头像 李华
网站建设 2026/1/12 10:30:21

java基础-IO流(打印流)

public class IOTest03 {public static void main(String[] args) throws FileNotFoundException {//创建字节打印流PrintStream ps new PrintStream("E:\\java\\javase\\basic\\javadown\\test5.txt");ps.println(97);ps.print(true);ps.printf("%s爱上了%s&q…

作者头像 李华