方法介绍
1. 均匀下采样(Uniform Downsampling)
原理:
-
按固定间隔选取点,例如设置
every_k_points=5
,则保留索引为0, 5, 10, ...
的点。 -
直接根据点的顺序进行采样,不依赖空间分布。
代码示例:
python
down_pcd = pcd.uniform_down_sample(every_k_points=5)
特点:
-
优点:计算速度快,适合有序点云(如激光雷达按行/列排列的数据)。
-
缺点:对无序点云效果差,可能导致采样不均匀或丢失局部细节。
-
输出点数:原始点数 /
every_k_points
(向下取整)。
适用场景:
-
有序点云(如深度相机、激光雷达数据)。
-
快速预览或低精度任务(如粗略配准)。
2. 体素下采样(Voxel Downsampling)
原理:
-
将点云空间划分为 体素网格(Voxel Grid),每个体素内保留一个点(通常取中心点或随机点)。
-
通过
voxel_size
控制网格大小,体素越大,降采样越激进。
代码示例:
python
voxel_size = 0.05 # 单位:米 down_pcd = pcd.voxel_down_sample(voxel_size)
特点:
-
优点:保持空间分布均匀,适合无序点云,能有效保留几何特征。
-
缺点:计算量略高于均匀下采样,体素大小需手动调整。
-
输出点数:取决于体素大小和点云密度。
适用场景:
-
通用场景(如点云配准、重建、分类)。
-
需要平衡数据量与几何信息保留的任务
3. 随机下采样(Random Downsampling)
原理:
-
随机丢弃点,保留指定比例的点。
-
Open3D 未直接提供 API,但可通过 NumPy 实现。
代码示例:
python
ratio = 0.2 # 保留20%的点 points = np.asarray(pcd.points) indices = np.random.choice(len(points), int(len(points) * ratio)) down_pcd = pcd.select_by_index(indices)
特点:
-
优点:实现简单,计算极快。
-
缺点:可能丢失关键区域数据,破坏空间结构。
-
输出点数:原始点数 ×
ratio
。
适用场景:
-
快速测试或对数据分布无要求的任务(如简单可视化)。
4. 曲率/法线下采样(Curvature/Normal-Based Sampling)
原理:
-
根据点云的 曲率 或 法线方向 保留特征点(如边缘、角点)。
-
需要先计算法线或曲率,再按阈值筛选。
代码示例(曲率筛选):
python
复制
# 计算曲率(需先计算法线) pcd.estimate_normals() curvatures = np.asarray(pcd.normals)[:, 3] # 假设曲率存储在法向量的第四维 threshold = 0.1 indices = np.where(curvatures > threshold)[0] down_pcd = pcd.select_by_index(indices)
特点:
-
优点:保留几何特征,适合需要细节的任务。
-
缺点:计算复杂,依赖法线/曲率估计的准确性。
-
输出点数:取决于特征点数量。
适用场景:
-
特征提取、细节重建(如工业零件检测)。
-
需要突出边缘或曲率变化的分析任务
5. 最远点采样(Farthest Point Sampling, FPS)
原理:
-
迭代选择距离已选点最远的点,确保采样点覆盖整个空间。
-
常用于深度学习中的点云特征学习。
代码示例(需手动实现或借助库):
python
复制
def farthest_point_sample(points, num_samples): # 自定义或使用 PyTorch3D 等库实现 pass down_points = farthest_point_sample(np.asarray(pcd.points), 1024) down_pcd = o3d.geometry.PointCloud() down_pcd.points = o3d.utility.Vector3dVector(down_points)
特点:
-
优点:空间覆盖均匀,适合深度学习模型输入。
-
缺点:计算复杂度高(O(N^2)),不适用于实时任务。
-
输出点数:固定为
num_samples
。
适用场景:
-
点云深度学习(如 PointNet、点云分割)。
-
需要均匀空间采样的任务。
方法对比总结
方法 | 速度 | 特征保留 | 空间均匀性 | 适用数据 | 典型场景 |
---|---|---|---|---|---|
均匀下采样 | ⚡⚡⚡ | 低 | 依赖点顺序 | 有序点云 | 快速预览、低精度配准 |
体素下采样 | ⚡⚡ | 中高 | 高 | 任意点云 | 通用任务(配准、重建) |
随机下采样 | ⚡⚡⚡ | 低 | 低 | 任意点云 | 快速测试 |
曲率下采样 | ⚡ | 高 | 低 | 高细节点云 | 特征提取、工业检测 |
最远点采样 | ⚡ | 中高 | 高 | 深度学习输入 | 点云分类、分割 |
选择建议
-
通用场景:优先使用 体素下采样(平衡速度与质量)。
-
有序点云:使用 均匀下采样(如激光雷达数据)。
-
深度学习:选择 最远点采样 或 体素下采样。
-
特征保留:使用 曲率下采样 或 法线筛选。
-
极速降采样:选择 随机下采样(牺牲质量换速度)。
参考资料
1.deepseek