3. 点云滤波基础:体素滤波、直通滤波、统计滤波的原理与对比

点云滤波,说白了就是给原始点云数据「洗个澡」。

我刚开始做激光雷达感知时,拿到一帧64线Velodyne的数据,几万个点直接往里灌。结果呢?算法跑得比蜗牛还慢,还全是噪点。后来才明白——滤波不是可选项,是必选项。

今天咱们聊三个最常用的滤波方法:体素滤波、直通滤波、统计滤波。它们各有各的脾气,用对了地方,事半功倍。

核心观点:滤波的本质是「去粗取精」——去掉冗余、噪声和无关区域,保留对感知任务最有价值的点。

3.1 体素滤波(Voxel Grid Filter)

体素滤波,我习惯叫它「下采样利器」。它的思路很简单:把空间切成一个个小立方体(体素),每个体素里只保留一个代表点。

原理:

  • 设定体素边长(比如0.1m)
  • 将点云划分到对应体素中
  • 每个体素内计算所有点的重心(或中心),作为输出点

嗯,这里要注意:体素边长选多大?我踩过坑。选太大,远处的小物体会直接消失;选太小,降采样效果不明显。一般0.05m~0.2m是个安全区间。

我的经验:做目标检测时,体素边长设为0.1m;做地图构建时,可以放宽到0.2m。你想想看,检测需要细节,地图更看重整体结构。

// PCL中的体素滤波示例
pcl::VoxelGrid<pcl::PointXYZ> voxel_filter;
voxel_filter.setInputCloud(cloud);
voxel_filter.setLeafSize(0.1f, 0.1f, 0.1f);  // 体素边长0.1m
voxel_filter.filter(*cloud_filtered);

优点:速度快、可控性强、能大幅减少点数。

缺点:会丢失局部细节,体素边界处可能出现锯齿效应。

3.2 直通滤波(PassThrough Filter)

直通滤波,说白了就是「切一刀」。指定一个轴(比如Z轴),只保留某个范围内的点。

我在项目中遇到过这种情况:激光雷达装在车顶,地面以下全是噪点。用直通滤波沿Z轴切掉负值区域,干净利落。

原理:

  • 选定坐标轴(X、Y或Z)
  • 设定最小值和最大值
  • 保留范围内的点,扔掉范围外的点
// PCL中的直通滤波示例
pcl::PassThrough<pcl::PointXYZ> pass;
pass.setInputCloud(cloud);
pass.setFilterFieldName("z");
pass.setFilterLimits(0.0, 2.5);  // 保留Z轴0~2.5m范围
pass.filter(*cloud_filtered);

避坑指南:我曾经把直通滤波的阈值设得太紧,结果把远处的行人切掉了一半。建议先可视化看一下点云分布,再定阈值。

优点:简单粗暴、计算量极小、适合去除固定区域的点。

缺点:只能沿坐标轴方向切割,无法处理倾斜或弯曲的边界。

3.3 统计滤波(StatisticalOutlierRemoval)

统计滤波,我管它叫「噪点杀手」。它基于一个假设:真实物体表面的点密度高,孤立噪点周围点稀疏。

原理:

  1. 对每个点,计算它到k个最近邻的平均距离
  2. 计算所有平均距离的均值和标准差
  3. 如果某点的平均距离 > 均值 + 标准差 × 倍数,判定为离群点

为什么会这样?因为噪点通常孤零零地飘着,周围没几个邻居。统计滤波就是抓住这个特征把它们揪出来。

// PCL中的统计滤波示例
pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;
sor.setInputCloud(cloud);
sor.setMeanK(50);          // 考虑50个近邻
sor.setStddevMulThresh(1.0); // 标准差倍数
sor.filter(*cloud_filtered);

我的习惯:setMeanK设50~100,setStddevMulThresh设1.0~2.0。倍数越小,剔除越狠。如果场景噪点多,可以适当放宽倍数。

优点:对孤立噪点效果极好、参数直观。

缺点:计算量大(需要建KD-Tree)、对边缘点可能误删。

3.4 三种滤波对比

特性 体素滤波 直通滤波 统计滤波
主要用途 降采样、减少点数 裁剪空间范围 去除离群噪点
计算速度 快 极快 较慢
参数敏感性 中等(体素边长) 低(阈值直观) 高(k和倍数)
是否改变点结构 是(生成新点) 否(保留原有点) 否(保留原有点)
典型应用场景 预处理、特征提取前 去除地面、天空 去噪、数据清洗

3.5 协同调优思路

实际项目中,这三种滤波经常搭配使用。我一般这么干:

  1. 先直通滤波:切掉明显无关的区域(比如地面以下、天空以上)
  2. 再统计滤波:干掉孤立噪点
  3. 最后体素滤波:降采样到合适密度

你想想看,这个顺序是有道理的。先切掉大块无用区域,减少后续计算量;再去噪,保证体素内点的质量;最后降采样,控制点数。

避坑指南:我曾经把体素滤波放在统计滤波前面,结果体素把噪点和正常点混在一起,统计滤波反而不好使了。顺序很重要,别搞反。

点云滤波三种方法核心逻辑 原始点云 体素滤波 降采样 稀疏均匀点云 保留结构 直通滤波 裁剪范围 感兴趣区域点云 去除无关区域 统计滤波 去除离群点 干净平滑点云 去除噪点 三种滤波方法各有侧重,实际应用中常组合使用

好了,三种滤波的原理和对比就聊到这儿。记住一句话:没有最好的滤波,只有最合适的组合。下一节咱们会深入代码实战,看看怎么把这些滤波串起来用。

可可精品资料库