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
数学可追溯 ⭐⭐⭐⭐⭐ ⭐⭐⭐
参数可解释 ⭐⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐
工业稳定性 ⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐
黑箱程度
相关推荐
救救孩子把2 小时前
59-机器学习与大模型开发数学教程-5-6 Adam、RMSProp、AdaGrad 等自适应优化算法
人工智能·算法·机器学习
进击的小头2 小时前
连续系统离散化方法(嵌入式信号处理实战指南)
c语言·算法·信号处理
永远都不秃头的程序员(互关)2 小时前
【决策树深度探索(五)】智慧之眼:信息增益,如何找到最佳决策问题?
算法·决策树·机器学习
智者知已应修善业2 小时前
【输出方形点阵】2024-11-1
c语言·c++·经验分享·笔记·算法
近津薪荼2 小时前
优选算法——双指针专题2(模拟)
c++·学习·算法
乌萨奇也要立志学C++2 小时前
【洛谷】DFS 新手必学的4 道DFS经典题 手把手教你剪枝与回溯
算法·深度优先
sali-tec2 小时前
C# 基于OpenCv的视觉工作流-章15-多边形逼近
图像处理·人工智能·opencv·算法·计算机视觉
一条大祥脚2 小时前
势能分析与势能线段树
开发语言·javascript·数据结构·算法
想做一只开心的菜鸡2 小时前
DARTS#01 | Tournament Sort算法 | MySQL深度翻页优化技巧 | 论文ByteSlice Review
数据库·mysql·算法