news 2026/7/2 1:28:43

第十三课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/7/1 1:24:12

【课程设计/毕业设计】基于python的人工智能 人脸识别系统设计与实现

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

作者头像 李华
网站建设 2026/7/1 1:25:52

风控不是算账,是“盯人”——聊聊 CEP 在风控与监控里的那些真本事

风控不是算账&#xff0c;是“盯人”——聊聊 CEP 在风控与监控里的那些真本事 大家好&#xff0c;我是 Echo_Wish。 这些年做大数据、做风控、做监控系统&#xff0c;越做越有一个强烈的感受&#xff1a;很多系统不是“算得不够准”&#xff0c;而是“看得不够快、不够懂事”。…

作者头像 李华
网站建设 2026/6/26 10:20:04

Agentic AI合规经验:提示工程架构师如何打造个人品牌?

Agentic AI合规时代,提示工程架构师如何用“技术+信任”打造个人品牌? 摘要/引言:当AI从“工具”变成“智能体”,提示工程师的品牌焦虑该怎么解? 凌晨3点,小张盯着电脑屏幕上的Agentic AI合规审计报告,揉了揉发涩的眼睛。作为某互联网公司的提示工程架构师,他上周刚上…

作者头像 李华
网站建设 2026/7/1 18:45:41

Availability(可用性)与高可用架构 内容的结构化知识点汇总

一、什么是 Availability&#xff08;可用性&#xff09; Availability 系统在一年中可正常提供服务的时间比例 常见两种表达方式&#xff1a;百分比&#xff08;99.9%&#xff09;N 个 9&#xff08;three nines&#xff09;可用性年宕机时间说法99%~3.65 天two nines99.9%~8…

作者头像 李华
网站建设 2026/6/26 10:20:04

Geek Uninstaller介绍(轻量高效的软件卸载专家)注册表清理注册表、卸载软件、应用卸载应用、文件卸载文件

https://geekuninstaller.com/download 文章目录Geek Uninstaller&#xff1a;轻量高效的软件卸载专家什么是Geek Uninstaller&#xff1f;核心功能与特点1. 彻底卸载2. 强制删除功能3. 注册表清理4. 绿色便携5. 轻量高效6. 简洁直观的界面使用方法免费版vs专业版与其他卸载软件…

作者头像 李华