【Open3D】Ch.2:点云体素下采样 | Python
体素下采样
- 前言
- 1. 官方文档
- 2. 基础概念简介
- Voxel:体素
- 下采样
- 三维体素网格
- 体素下采样
- 3. 例程拆解和复现
- 3.1 先跑例程
- 3.2 例程拆解
- 后记
- 参考资料
前言
在处理点云数据时,我们有时候会遇到点数太多导致后续操作拖慢计算速度的情况。
在Ch.2中主要写Open3D库对点云数据进行体素下采样的基本操作,能在大幅减少点云数量的同时,最大程度保留点云的整体几何结构。
主要分成以下几个部分:
- 官方文档翻译
- 基础概念简介
- 例程拆解
本文仍为学习笔记,非系统教程,建议根据需求跳转到对应部分阅读。
文末参考资料我放了链接,可直接跳转到相关网站。
1. 官方文档
体素下采样使用规则的体素网格,从输入点云中创建出均匀下采样的点云。它通常被用作许多点云处理任务的预处理步骤。该算法分为两个步骤:
- 点被分到各个体素中。
- 每个被占据的体素通过对其内部所有点取平均,恰好生成一个点。
2. 基础概念简介
(在此只对概念做简单的介绍,想要深入了解的可以参考文末的参考文献)
Voxel:体素
可以类比为立体的像素,只是像素是在二维数据下的最小的可操作单位,而体素则是在三维空间下的。
下采样
下采样也叫降采样,是主动减少数据样本数量的过程,目的是降低数据量、简化计算或过滤噪声。
三维体素网格
三维体素网格滤波器,就是把三维空间切割成无数个体素的网格结构,每个体素代表一个三维空间单位。
该算法的使用步骤:
- 按照体素的空间范围,将点 分组装入 体素中。
- 对每个包含点的体素,计算体素内所有点的平均坐标,代表该体素内的所有点,这个平均点能反映体素内点云的密度中心,生成下采样后的点云。
体素下采样
体素下采样是用三维体素网格对密集点云分组简化
3. 例程拆解和复现
3.1 先跑例程
import open3d as o3d
import numpy as np# 这部分在Ch.1已经讲过就不要重复讲了
ply_point_cloud = o3d.data.PLYPointCloud()
pcd = o3d.io.read_point_cloud(ply_point_cloud.path)
print(pcd)
print(np.asarray(pcd.points))# 这块是新增的:体素下采样
print("Downsample the point cloud with a voxel of 0.05")
downpcd = pcd.voxel_down_sample(voxel_size=0.05)# 这块也已经讲过了
o3d.visualization.draw_geometries([downpcd],zoom=0.3412,front=[0.4257, -0.2125, -0.8795],lookat=[2.6172, 2.0475, 1.532],up=[-0.0694, -0.9768, 0.2024])
运行后,终端会输出带你云的基本信息,同时弹出可视化窗口,如下:
让我们回忆一下Ch.1中,没有进行过体素下采样的原始图:
可以看出很明显的变化,点云的体量变小了。
3.2 例程拆解
Open3D 为体素下采样提供了简介的API:
pcd.voxel_down_sample(voxel_size)
这是 PointCloud 对象的方法。
参数:voxel_size 用于调节体素的边长。它决定了下采样的 颗粒度。值越小,体素数量越多,保留的点云细节越丰富,但降采样效果越弱;值越大,体素数量越少,降采样越彻底,但可能丢失局部细节。
(如果想看体素下采样的过程以及Open3D中voxel_down_sample的底层代码,可以参看参考文末的参考资料)
我们复用 Ch.1 的测试数据,体验最基础的下采样流程:
# 体素下采样:调节体素边长
import open3d as o3d
import numpy as np# 读取点云(与Part 1一致)
ply_point_cloud = o3d.data.PLYPointCloud()
pcd = o3d.io.read_point_cloud(ply_point_cloud.path)# voxel_down_sample是 PointCloud 类的方法,专门用于体素下采样功能
# voxel_size参数 用于设定“体素的边长”;数值越小,体素数量越多,点云保留的细节越丰富,丢失的信息越少
voxel_size = 0.05
print(f"使用体素大小为 {voxel_size} 的体素来下采样点云")
downpcd = pcd.voxel_down_sample(voxel_size = voxel_size)# 可视化下采样结果(与Part 1一致)
o3d.visualization.draw_geometries([downpcd],zoom=0.3412,front=[0.4257, -0.2125, -0.8795],lookat=[2.6172, 2.0475, 1.532],up=[-0.0694, -0.9768, 0.2024])
运行以上代码后你可以得到下方窗口的结果:
我们可以调整 voxel_size 的大小看看会有什么变化:
- voxel_size = 0.001,基本和原数据相同,看不出有什么丢失的信息
2. voxel_size = 0.1,点云变得非常稀疏,信息丢失严重
后记
感谢你能看到这,希望我的笔记能对你有帮助。
文章相关代码我已经放到了我的Gitee里了,有需要的可以自取Open3D点云笔记。
我还在学习阶段,个人能力有限,文章难免有疏漏和差错,望指出。
下一篇写 顶点法向估计。
参考资料
- Open3D官方文档
Open3D Point cloud - 体素
什么是体素(Voxel)? - 三维体素网格
使用体素网格(VoxelGrid)滤波器进行下采样
体渲染4:基于三维体素网格