news 2026/5/1 10:56:35

第九课Open3D点云数据处理:直通滤波

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
第九课Open3D点云数据处理:直通滤波

1 算法原理

2 代码实现

2.1 提取滤波后点云和噪声点云

2.2 优化后的代码

直通滤波(AABB包围盒法)

1 算法原理

2 AABB法直通滤波

2.1 X轴方向的直通滤波

2.2 Y轴方向的直通滤波

2.3 Z轴方向的直通滤波

2.4 函数封装 pass_through_by_AABB(cloud, min_val, max_val, filter_axis)

参考文献


1 算法原理

点云直通滤波(PassThrough Filter)是一种简单的点云处理方法,主要用于过滤掉点云中不需要的点,保留需要的点,实现简单、高效。

该滤波器操作的基本思想是将点云中的某一维度的值限制在一个范围内,例如只保留点云中位于某一高度范围内的点。具体步骤如下:

  1. 选择需要保留的维度(通常是x、y、z坐标)。

  2. 设定保留的范围(一般为一个数值范围),如只保留z坐标在0-2米的点。

  3. 遍历点云,将超出保留范围的点删除。

下面是点云直通滤波的一些示例应用:

  • 保留一定范围内的点云数据,如室内地面或天花板。

  • 剔除由于传感器本身等原因产生的异常值,如激光雷达垂直方向上的异常点。

  • 根据航拍数据的高度,划定地面和建筑物的分界线,以便进行后续处理。

总之,点云直通滤波可以帮助我们更加高效地处理点云数据,提高处理效率和准确度。

2 代码实现

2.1 提取滤波后点云和噪声点云

代码示例:

import numpy as np import open3d as o3d def pass_through(cloud, min_val, max_val, filter_axis="x", invert=False): """ @直通滤波 @param[I]: cloud:输入点云 @param[I]: min_val: 滤波轴向最小值 @param[I]: max_val: 滤波轴向最大值 @param[I]: filter_axis: 滤波轴{x | y | z}, default:x @param[I]: invert, 是否取反, 默认Flase, 提取ind索引对应的点云; True, 提取ind索引之外的点云 @return: filter_cloud, 滤波后的点云 """ points = np.asarray(cloud.points) if filter_axis == "x": ind = np.where((points[:, 0] >= min_val) & (points[:, 0] <= max_val))[0] filter_cloud = pcd.select_by_index(ind, invert) return filter_cloud elif filter_axis == "y": ind = np.where((points[:, 1] >= min_val) & (points[:, 1] <= max_val))[0] filter_cloud = cloud.select_by_index(ind, invert) return filter_cloud elif filter_axis == "z": ind = np.where((points[:, 2] >= min_val) & (points[:, 2] <= max_val))[0] filter_cloud = pcd.select_by_index(ind, invert) return filter_cloud # False的时候是取内,表示保存的是内部的点。 else: print("\a参数错误!") return o3d.geometry.PointCloud() if __name__ == "__main__": # 加载点云数据 pcd = o3d.io.read_point_cloud(r"H:\HTempWK\temp\open3d\data_1\0000000015.pcd") # 滤波后的点云 filter_cloud = pass_through(pcd, min_val=0.5, max_val=3.3, filter_axis="x") # 噪声点云 filter_cloud_noise = pass_through(pcd, min_val=0.5, max_val=3.3, filter_axis="x", invert=True) # 滤波点云赋色(蓝) filter_cloud .paint_uniform_color([0, 0, 1]) # 噪声点云赋色(红) filter_cloud_noise.paint_uniform_color([1,0.4,0.4]) # 可视化结果 o3d.visualization.draw_geometries([filter_cloud,filter_cloud_noise])

2.2 优化后的代码

以下是优化后的代码,主要使用了三元表达式简化了代码:

import numpy as np import open3d as o3d def pass_through(cloud, min_val, max_val, filter_axis="x", invert=False): """ @直通滤波 @param[I]: cloud:输入点云 @param[I]: min_val: 滤波轴向最小值 @param[I]: max_val: 滤波轴向最大值 @param[I]: filter_axis: 滤波轴{x | y | z}, default:x @param[I]: invert, 是否取反, 默认Flase, 提取ind索引对应的点云; True, 提取ind索引之外的点云 @return: filter_cloud, 滤波后的点云 """ points = np.asarray(cloud.points) ind = np.where((points[:, ["x", "y", "z"].index(filter_axis)] >= min_val) & (points[:, ["x", "y", "z"].index(filter_axis)] <= max_val))[0] return cloud.select_by_index(ind,invert) if __name__ == "__main__": # 加载点云数据 pcd = o3d.io.read_point_cloud(r"H:\HTempWK\temp\open3d\pointdata\feiji.pcd") # 滤波后的点云 filter_cloud = pass_through(pcd, min_val=0.0, max_val=13.3, filter_axis="x") # 噪声点云 filter_cloud_noise = pass_through(pcd, min_val=0.0, max_val=13.3, filter_axis="x", invert=True) # 滤波点云赋色(蓝) filter_cloud .paint_uniform_color([0, 0, 1]) # 噪声点云赋色(红) filter_cloud_noise.paint_uniform_color([1,0.4,0.4]) # 可视化结果 o3d.visualization.draw_geometries([filter_cloud,filter_cloud_noise], window_name="优化后的直通滤波")

直通滤波(AABB包围盒法)

1 算法原理

点云直通滤波(PassThrough Filter)是一种简单的点云处理方法,主要用于过滤掉点云中不需要的点,保留需要的点,实现简单、高效。

该滤波器操作的基本思想是将点云中的某一维度的值限制在一个范围内,例如只保留点云中位于某一高度范围内的点。具体步骤如下:

  1. 选择需要保留的维度(通常是x、y、z坐标)。

  2. 设定保留的范围(一般为一个数值范围),如只保留z坐标在0-2米的点。

  3. 遍历点云,将超出保留范围的点删除。

下面是点云直通滤波的一些示例应用:

  • 保留一定范围内的点云数据,如室内地面或天花板。

  • 剔除由于传感器本身等原因产生的异常值,如激光雷达垂直方向上的异常点。

  • 根据航拍数据的高度,划定地面和建筑物的分界线,以便进行后续处理。

总之,点云直通滤波可以帮助我们更加高效地处理点云数据,提高处理效率和准确度。

2 AABB法直通滤波

AABB法直通滤波,是指使用AABB包围盒进行点云直通滤波。

可以根据实际需求,自定义包围盒最小顶点min_bound和最大顶点max_bound,设置某一维度坐标边界值,其他维度设置为无穷远。使用点云裁剪函数crop(),保留AABB包围盒范围内的点云,实现直通滤波。

最小顶点min_bound和最大顶点max_bound具体设置如下:

  • x 轴方向的直通滤波:

    min_bound = [x_min, -np.inf, -np.inf] max_bound = [x_max, np.inf, np.inf]
  • y 轴方向的直通滤波:

    min_bound = [-np.inf, y_min, -np.inf] max_bound = [np.inf, y_max, np.inf]
  • z 轴方向的直通滤波:

    min_bound = [-np.inf, -np.inf, z_min] max_bound = [np.inf, np.inf, z_max]
  • 多个轴向的直通滤波

    min_bound = [x_min, y_min, z_min] max_bound = [x_max, y_max, z_max]

2.1 X轴方向的直通滤波

import open3d as o3d import numpy as np # 创建点云数据 pcd = o3d.io.read_point_cloud(r"H:\HTempWK\temp\open3d\pointdata\feiji.pcd") pcd.paint_uniform_color([1,0.4,0.4]) # 定义过滤范围,例如使用x轴的过滤范围 x_min = 0.0 x_max = 12.3 min_bound = [x_min, -np.inf, -np.inf] max_bound = [x_max, np.inf, np.inf] # 创建滤波器 filter_cloud = pcd.crop(o3d.geometry.AxisAlignedBoundingBox(min_bound, max_bound)) filter_cloud .paint_uniform_color([0, 0, 1]) # 可视化结果 o3d.visualization.draw_geometries([filter_cloud ,pcd])

2.2 Y轴方向的直通滤波

import open3d as o3d import numpy as np # 创建点云数据 pcd = o3d.io.read_point_cloud(r"H:\HTempWK\temp\open3d\pointdata\feiji.pcd") pcd.paint_uniform_color([1,0.4,0.4]) # 定义过滤范围,例如使用y轴的过滤范围 y_min = 0.0 y_max = 12.3 min_bound = [-np.inf, y_min, -np.inf] max_bound = [np.inf, y_max, np.inf] # 创建滤波器 filter_cloud = pcd.crop(o3d.geometry.AxisAlignedBoundingBox(min_bound, max_bound)) filter_cloud .paint_uniform_color([0, 0, 1]) # 可视化结果 o3d.visualization.draw_geometries([filter_cloud ,pcd])

2.3 Z轴方向的直通滤波

import open3d as o3d import numpy as np # 创建点云数据 pcd = o3d.io.read_point_cloud(r"H:\HTempWK\temp\open3d\pointdata\feiji.pcd") pcd.paint_uniform_color([1,0.4,0.4]) # 定义过滤范围,例如使用z轴的过滤范围 z_min = 0.0 z_max = 3.0 min_bound = [-np.inf, -np.inf, z_min] max_bound = [np.inf, np.inf, z_max] # 创建滤波器 filter_cloud = pcd.crop(o3d.geometry.AxisAlignedBoundingBox(min_bound, max_bound)) filter_cloud .paint_uniform_color([0, 0, 1]) # 可视化结果 o3d.visualization.draw_geometries([filter_cloud ,pcd])

2.4 函数封装 pass_through_by_AABB(cloud, min_val, max_val, filter_axis)

import open3d as o3d import numpy as np def pass_through_by_AABB(cloud, min_val, max_val, filter_axis = "x"): """ @describe: AABB法直通滤波 @param[I]: cloud, 待滤波点云 @param[I]: min_val, 最小坐标值 @param[I]: max_val, 最大坐标值 @param[I]: filter_axis, 滤波轴向{x | y | z}, default:x @return: filter_cloud: 滤波后点云 """ if filter_axis == "x": # 最大最小顶点 min_bound = [min_val, -np.inf, -np.inf] max_bound = [max_val, np.inf, np.inf] # 创建滤波器 filter_cloud = cloud.crop(o3d.geometry.AxisAlignedBoundingBox(min_bound, max_bound)) return filter_cloud elif filter_axis == "y": # 最大最小顶点 min_bound = [-np.inf, min_val, -np.inf] max_bound = [np.inf, max_val, np.inf] # 创建滤波器 filter_cloud = cloud.crop(o3d.geometry.AxisAlignedBoundingBox(min_bound, max_bound)) return filter_cloud elif filter_axis == "z": # 最大最小顶点 min_bound = [-np.inf, -np.inf, min_val] max_bound = [np.inf, np.inf, max_val] # 创建滤波器 filter_cloud = cloud.crop(o3d.geometry.AxisAlignedBoundingBox(min_bound, max_bound)) return filter_cloud else: print("\a参数错误!") return o3d.geometry.PointCloud() if __name__ == "__main__": # 加载点云数据 pcd = o3d.io.read_point_cloud(r"H:\HTempWK\temp\open3d\pointdata\feiji.pcd") # 原始点云赋色(橘红) pcd.paint_uniform_color([1,0.4,0.4]) # AABB法直通滤波(x轴) # 完整写法 filter_cloud = pass_through_by_AABB(pcd, 0.0, 3.3, "x") # 省略轴向,则默认为x轴方向直通滤波 # filter_cloud = pass_through_by_AABB(pcd, 0.5, 1.3) # 滤波点云赋色(蓝) filter_cloud.paint_uniform_color([0,0,1]) # 可视化结果 o3d.visualization.draw_geometries([filter_cloud,pcd])

参考文献

https://sunwukong.blog.csdn.net/article/details/131605765

https://sunwukong.blog.csdn.net/article/details/131563115

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/22 15:36:03

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

1 中值滤波原理 2 与均值滤波对比 3 中值滤波代码实现 3.1 代码行实现 3.2 将中值滤波的实现封装到函数 pointCloud_median_filter() 中 1 中值滤波原理 点云中值滤波是将空间中每个点的值替换为其邻域点值的中位数。具体来说&#xff0c;对于给定点云中的每个点&#xff…

作者头像 李华
网站建设 2026/4/28 9:47:59

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

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

作者头像 李华
网站建设 2026/4/22 22:46:46

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

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

作者头像 李华
网站建设 2026/4/26 12:23:05

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

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

作者头像 李华
网站建设 2026/4/30 23:40:28

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

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

作者头像 李华
网站建设 2026/4/30 23:44:19

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

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

作者头像 李华