PCL 中常用的滤波对比

一、目的

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)⭐⭐⭐⭐⭐

原理(一定要讲清)

  1. 对每个点:

    • 找 k 近邻

    • 计算平均距离 dˉ

  2. 全局统计:

  3. 判定

本质

👉 基于"局部密度一致性"的统计假设

示例

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
数学可追溯 ⭐⭐⭐⭐⭐ ⭐⭐⭐
参数可解释 ⭐⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐
工业稳定性 ⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐
黑箱程度
相关推荐
仰泳的熊猫1 小时前
题目2570:蓝桥杯2020年第十一届省赛真题-成绩分析
数据结构·c++·算法·蓝桥杯
无极低码4 小时前
ecGlypher新手安装分步指南(标准化流程)
人工智能·算法·自然语言处理·大模型·rag
软件算法开发5 小时前
基于海象优化算法的LSTM网络模型(WOA-LSTM)的一维时间序列预测matlab仿真
算法·matlab·lstm·一维时间序列预测·woa-lstm·海象优化
superior tigre5 小时前
22 括号生成
算法·深度优先
努力也学不会java7 小时前
【缓存算法】一篇文章带你彻底搞懂面试高频题LRU/LFU
java·数据结构·人工智能·算法·缓存·面试
旖-旎7 小时前
二分查找(x的平方根)(4)
c++·算法·二分查找·力扣·双指针
ECT-OS-JiuHuaShan7 小时前
朱梁万有递归元定理,重构《易经》
算法·重构
智者知已应修善业8 小时前
【51单片机独立按键控制数码管移动反向,2片74CH573/74CH273段和位,按键按下保持原状态】2023-3-25
经验分享·笔记·单片机·嵌入式硬件·算法·51单片机
khddvbe8 小时前
C++并发编程中的死锁避免
开发语言·c++·算法