一、目的
PCL 的滤波本质 = 在点云的空间 / 统计 / 几何结构上做约束
目的只有三个:
降噪、下采样、去异常点

二、PCL 滤波算子的三大类
| 类别 | 解决问题 |
|---|---|
| 空间采样类 | 点太密、数据太大 |
| 统计 / 密度类 | 离群点 |
| 几何约束类 | 结构不合理的点 |
三、空间采样类
VoxelGrid(体素滤波)⭐⭐⭐⭐⭐
原理
-
将空间划分为 立方体体素
-
每个体素 → 用 质心 或 平均点 代替
数学上:

特点
| 优点 | 缺点 |
|---|---|
| 下采样均匀 | 会模糊边缘 |
| 速度快 | 精度下降 |
PCL 示例
cpp
pcl::VoxelGrid<pcl::PointXYZ> vg;
vg.setLeafSize(0.01f, 0.01f, 0.01f);
vg.setInputCloud(cloud);
vg.filter(*cloud_filtered);
Q2:为什么 VoxelGrid 会模糊边缘?
体素内做均值,破坏高频几何结构
边缘的本质
几何不连续
曲率突变
法向急剧变化
信号处理视角(非常高级,但很加分)
VoxelGrid ≈ 盒函数卷积 + 下采样
rect = 体素窗口
卷积 = 平滑
下采样 = 混叠风险
👉 这就是标准低通 + 降采样
VoxelGrid
-
参数:体素大小 Δ
-
Δ 过大 → 结构损失
-
Δ 过小 → 效果不明显
VoxelGrid 牺牲局部几何细节换取全局稳定性
ApproximateVoxelGrid(近似滤波)
-
与 VoxelGrid 类似
-
使用近似哈希
-
更快,但不稳定
👉 实时系统可用
四、范围裁剪类
PassThrough(直通滤波)
原理

👉 简单几何约束
应用
-
去掉地面下方
-
限制 ROI
cpp
// Create the filtering object
pcl::PassThrough<pcl::PointXYZ> pass;
pass.setInputCloud(cloud);
pass.setFilterFieldName("z");
pass.setFilterLimits(0.0, 1.0);
//pass.setFilterLimitsNegative(true);
pass.filter(*cloud_filtered);
五、统计 / 密度类(去噪核心)
StatisticalOutlierRemoval(SOR)⭐⭐⭐⭐⭐
原理(一定要讲清)
-
对每个点:
-
找 k 近邻
-
计算平均距离 dˉ
-
-
全局统计:

-
判定

本质
👉 基于"局部密度一致性"的统计假设
示例
cpp
// 创建过滤对象
pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;
sor.setInputCloud(cloud);
sor.setMeanK(50);
sor.setStddevMulThresh(1.0);
sor.filter(*cloud_filtered);
RadiusOutlierRemoval(ROR)
原理
-
半径 rrr
-
至少 NNN 个邻居
-


cpp
// 构建过滤器
pcl::RadiusOutlierRemoval<pcl::PointXYZ> outrem;
outrem.setInputCloud(cloud);
outrem.setRadiusSearch(0.8);
outrem.setMinNeighborsInRadius(2);
// apply filter
outrem.filter(*cloud_filtered);
对比 SOR
| SOR | ROR | |
|---|---|---|
| 参数 | k, σ | r, N |
| 稳定性 | 高 | 对参数敏感 |
| 工程 | 常用 | 辅助 |
Q:SOR 和 ROR 本质差别?
统计一致性 vs 几何密度阈值
SOR 是"统计一致性滤波",
ROR 是"几何密度阈值滤波"。
SOR 通过统计局部邻域距离的一致性来判断异常点,具有自适应和鲁棒性;
ROR 则通过固定半径内点数进行硬阈值判断,更依赖参数和点云密度。
| 维度 | SOR | ROR |
|---|---|---|
| 判据类型 | 统计量 | 几何计数 |
| 随机性假设 | 有(高斯) | 无 |
| 全局自适应 | ✔ | ❌ |
| 参数物理意义 | 弱 | 强 |
| 鲁棒性 | 高 | 低 |
🌰 举一个点云例子
场景:
-
前景物体:密集
-
背景:稀疏
-
噪声:零星飞点
ROR 的行为
-
固定半径 r
-
固定最小点数 N
👉 问题:
-
在稀疏区域,正常点可能被误删
-
在密集区域,异常点可能存活
SOR 的行为
-
自动学习整体"平均密度"
-
比较"谁明显偏离群体"
👉 结果:
- 对非均匀密度更稳
六、几何一致性类(结构滤波)
ConditionalRemoval
原理
自定义条件:
cpp
bool condition(const PointT& p) {
return (p.z > 0 && p.intensity > 30);
}
ProjectInliers(投影)
-
将点 投影到模型
-
本质是 几何约束
例如投影到平面:

七、基于平滑的滤波(进阶)
MLS(Moving Least Squares)⭐⭐⭐⭐
原理
-
局部邻域
-
拟合低阶曲面
-
投影点到曲面

特点
| MLS | |
|---|---|
| 效果 | 平滑 + 去噪 |
| 代价 | 高 |
| 用途 | 表面重建 |
滤波算子对比速览
| 滤波器 | 目的 | 是否破坏结构 |
|---|---|---|
| VoxelGrid | 下采样 | ✔ |
| PassThrough | ROI | ❌ |
| SOR | 去噪 | ❌ |
| ROR | 去噪 | ❌ |
| MLS | 平滑 | ✔ |
| ProjectInliers | 结构对齐 | ✔ |
cpp
原始点云
↓
PassThrough(裁剪)
↓
VoxelGrid(下采样)
↓
SOR / ROR(去噪)
↓
RANSAC(模型)
八、PCL 滤波 vs Open3D vs Halcon 对照对比
PCL = 经典几何与统计的工具箱
Open3D = 现代工程与学习友好的平台
HALCON = 工业视觉里"可控、稳定、可交付"的黑箱
| 库 | 核心哲学 |
|---|---|
| PCL | 算法研究 + 几何严谨 |
| Open3D | 易用 + 现代 + 学术工程 |
| HALCON | 工业可靠性 + 确定性 |
下采样 / 空间滤波
| 功能 | PCL | Open3D | HALCON |
|---|---|---|---|
| 体素下采样 | VoxelGrid |
voxel_down_sample |
reduce_object_model_3d |
| 近似体素 | ApproxVoxelGrid |
❌ | ❌ |
| 随机采样 | RandomSample |
random_down_sample |
sample_object_model_3d |
本质对比
-
PCL:结构最全
-
Open3D:API 极简
-
HALCON:参数少但稳定
离群点 / 去噪
| 功能 | PCL | Open3D | HALCON |
|---|---|---|---|
| 统计滤波 | StatisticalOutlierRemoval |
remove_statistical_outlier |
select_object_model_3d |
| 半径滤波 | RadiusOutlierRemoval |
remove_radius_outlier |
select_object_model_3d |
| 条件滤波 | ConditionalRemoval |
❌ | 规则内建 |
平滑 / 几何一致性
| 功能 | PCL | Open3D | HALCON |
|---|---|---|---|
| MLS 平滑 | ✔ | ❌ | ✔(内部) |
| 法向平滑 | ✔ | ✔ | ✔ |
| 投影滤波 | ProjectInliers |
❌ | project_object_model_3d |
算法透明度 vs 工程确定性
| 维度 | PCL | Open3D | HALCON |
|---|---|---|---|
| 数学可追溯 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐ |
| 参数可解释 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ |
| 工业稳定性 | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| 黑箱程度 | 低 | 中 | 高 |
