4. 滤波算法分类:基于距离、基于统计、基于体素、基于深度学习的四大类方法

说实话,点云滤波这个事儿,刚入行的时候我也觉得挺简单的——不就是把噪声去掉嘛。但真正上手做项目才发现,选错滤波方法,轻则效果打折扣,重则直接把有用信息给滤没了。我踩过的坑,今天一次性给你讲清楚。

点云滤波算法,按原理可以分成四大类。每一类都有自己的脾气秉性。咱们一个一个来看。

4.1 基于距离的滤波

这类方法最直观。说白了就是:离我太远的不要,离我太近的也不要。

典型代表:直通滤波、半径滤波、条件滤波

直通滤波,我习惯叫它「一刀切」。你设定一个范围,比如Z轴0到2米,之外的统统干掉。我在做AGV导航时经常用这招——地面以上的点留着,天花板和远处的杂点直接砍掉,效率极高。

// 直通滤波示例(伪代码)
PassThrough filter;
filter.setInputCloud(cloud);
filter.setFilterFieldName("z");
filter.setFilterLimits(0.0, 2.0);
filter.filter(*filteredCloud);
我的小技巧:直通滤波一定要放在预处理的第一步。先砍掉明显没用的区域,后续计算量能减少30%以上。

半径滤波呢,是检查每个点周围有没有足够多的邻居。如果邻居太少,说明这个点很可能是孤立的噪声点。我在做室外激光雷达数据时,经常用半径滤波来干掉那些飘在空中的飞点。

条件滤波更灵活,你可以组合多个条件。比如「距离在1-10米之间,且强度值大于50」——这种组合拳在实际项目中非常实用。

4.2 基于统计的滤波

这类方法的核心思想是:异常点往往不符合统计规律。

典型代表:统计滤波、高斯滤波

统计滤波是我个人最常用的方法之一。它计算每个点到其K个近邻的平均距离,然后假设这些距离服从高斯分布。那些距离均值太远的点,就被判定为离群点。

嗯,这里要注意一个参数——标准差倍数。我刚开始用的时候,把倍数设得太小,结果把墙面上的一些有效点也给滤掉了。后来我总结了一个经验:室内场景用1.0-1.5倍,室外场景用2.0-3.0倍。

避坑指南:我曾经在一个果园的扫描数据上用了统计滤波,结果把树干上的点都滤掉了。后来发现是因为树干表面的点密度不均匀,统计模型失效了。遇到这种情况,建议改用半径滤波或者体素滤波。

高斯滤波更平滑一些,适合对点云做平滑处理。但说实话,在SLAM里我很少直接用高斯滤波——它容易把边缘特征给模糊掉,影响后续的配准精度。

4.3 基于体素的滤波

这类方法,说白了就是把空间切成小方块,每个方块里只保留一个代表点。

典型代表:体素滤波(Voxel Grid)

体素滤波是我在项目中用得最多的降采样方法。为什么?因为它能保持点云的形状特征,同时大幅减少点数。

你想想看,一个10万点的点云,用0.1米的体素滤波一过,可能就剩下1万点了。但形状基本不变。这对实时SLAM来说太重要了。

// 体素滤波示例
VoxelGrid filter;
filter.setInputCloud(cloud);
filter.setLeafSize(0.1f, 0.1f, 0.1f);  // 体素大小
filter.filter(*filteredCloud);
注意:体素大小不是越小越好。设得太小,降采样效果不明显;设得太大,会丢失细节。我一般建议从0.05米开始试,根据实际效果调整。

体素滤波还有一个变种——体素中心滤波和体素重心滤波。前者取体素的几何中心,后者取体素内所有点的重心。我个人更推荐重心滤波,因为它更能代表原始点的分布。

4.4 基于深度学习的滤波

这是近几年才火起来的方向。用神经网络来学习哪些点是噪声,哪些点该保留。

典型代表:PointNet、PointCNN、DensePoint

说实话,深度学习滤波在学术界很热,但在工业落地中我见得不多。原因很简单:需要大量标注数据,而且泛化能力有限。

我在一个项目中试过用PointNet做去噪,训练集上效果很好,但换了一个传感器型号后,效果直接崩了。后来我总结:深度学习滤波适合场景固定、传感器固定的情况,比如工厂里的固定式扫描。

我的建议:如果你做的是通用SLAM系统,优先考虑前三种传统方法。如果场景非常特定,且有充足的数据,再考虑深度学习方案。

不过话说回来,深度学习滤波有一个传统方法做不到的优势——能处理非常复杂的噪声模式。比如混合了高斯噪声、离群点、甚至遮挡造成的空洞,传统方法往往需要组合多种滤波器,而深度学习可以端到端地学习。

4.5 四大类方法对比

为了让你看得更清楚,我整理了一个对比表:

方法类别 核心思想 典型算法 适用场景 计算效率
基于距离 按空间范围裁剪 直通滤波、半径滤波 预处理、去除远点 极高
基于统计 利用分布规律 统计滤波、高斯滤波 去除离群点 中等
基于体素 空间离散化 体素滤波 降采样、均匀化 高
基于深度学习 学习噪声模式 PointNet等 复杂噪声、特定场景 低(需GPU)

你看,没有哪种方法是万能的。实际项目中,我通常的做法是:先用直通滤波砍掉无效区域,再用体素滤波降采样,最后用统计滤波去离群点。这套组合拳,应付90%的场景都没问题。

最后说一句:滤波不是越干净越好。有时候保留一些「看似噪声」的点,反而对后续的特征提取有帮助。我在做视觉SLAM时就发现,过度滤波会导致特征点太少,匹配失败。所以,滤波的度,要结合下游任务来把握。
点云滤波算法四大分类 点云滤波算法 基于距离 直通滤波 半径滤波 条件滤波 基于统计 统计滤波 高斯滤波 离群点去除 基于体素 体素滤波 体素中心滤波 体素重心滤波 基于深度学习 PointNet PointCNN DensePoint 选型建议 预处理阶段 → 基于距离(快速裁剪) 降采样阶段 → 基于体素(保持形状) 去噪阶段 → 基于统计(去除离群点)

这张图把四大类方法的关系和选型建议都画出来了。你可以把它当作一个快速参考——做项目时先看场景,再选方法,别一上来就套深度学习,那玩意儿杀鸡用牛刀。

好了,这一章的内容就到这儿。记住:没有最好的滤波算法,只有最合适的。多试几种,找到最适合你场景的那一个。