点云滤波相关

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了点云滤波相关相关的知识,希望对你有一定的参考价值。

参考技术A 复制于:https://zhuanlan.zhihu.com/p/102748557

介绍

主要方法

直通滤波(PassThrough 滤波)

VoxelGrid滤波器对点云进行下采样

均匀采样

增采样

statisticalOutlierRemoval滤波器移除离群点

使用参数化模型投影点云

ConditionalRemoval

RadiusOutlinerRemoval 移除离群点

从一个点云中提取索引 根据点云索引提取对应的点云

介绍

点云滤波,顾名思义,就是滤掉噪声。原始采集的点云数据往往包含大量散列点、孤立点,在获取点云数据时 ,由于设备精度,操作者经验环境因素带来的影响,以及电磁波的衍射性,被测物体表面性质变化和数据拼接配准操作过程的影响,点云数据中讲不可避免的出现一些噪声。在点云处理流程中滤波处理作为预处理的第一步,对后续的影响比较大,只有在滤波预处理中将噪声点 ,离群点,孔洞,数据压缩等按照后续处理定制,才能够更好的进行配准,特征提取,曲面重建,可视化等后续应用处理。其类似于信号处理中的滤波,

点云滤波方法主要有:

1. 直通滤波器  pcl::PassThrough<pcl::PointXYZ> pass

2. 体素格滤波器 pcl::VoxelGrid<pcl::PCLPointCloud2> sor;

3. 统计滤波器    pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;

4. 半径滤波器    pcl::RadiusOutlierRemoval<pcl::PointXYZ> outrem;

5. 双边滤波  pcl::BilateralFilter<pcl::PointXYZ> bf;

       该类的实现利用的并非XYZ字段的数据进行,而是利用强度数据进行双边滤波算法的实现,所以在使用该类时点云的类型必须有强度字段,否则无法进行双边滤波处理,双边滤波算法是通过取临近采样点和加权平均来修正当前采样点的位置,从而达到滤波效果,同时也会有选择剔除与当前采样点“差异”太大的相邻采样点,从而保持原特征的目的 。

6. 高斯滤波    pcl::filters::GaussianKernel< PointInT, PointOutT > 

     是基于高斯核的卷积滤波实现  高斯滤波相当于一个具有平滑性能的低通滤波器

7. 立方体滤波 pcl::CropBox< PointT>   

  过滤掉在用户给定立方体内的点云数据

8. 封闭曲面滤波 pcl::CropHull< PointT> 

    过滤在给定三维封闭曲面或二维封闭多边形内部或外部的点云数据       

9. 空间剪裁:

        pcl::Clipper3D<pcl::PointXYZ>

        pcl::BoxClipper3D<pcl::PointXYZ>

        pcl::CropBox<pcl::PointXYZ>

        pcl::CropHull<pcl::PointXYZ> 剪裁并形成封闭曲面   

10. 卷积滤波:实现将两个函数通过数学运算产生第三个函数,可以设定不同的卷积核

        pcl::filters::Convolution<PointIn, PointOut>

        pcl::filters::ConvolvingKernel<PointInT, PointOutT> 

11. 随机采样一致滤波

    等,

    通常组合使用完成任务。

PCL中点云滤波的方案

点云数据密度不规则需要平滑

因为遮挡等问题造成离群点需要去除

大量数据需要下采样

噪声数据需要去除

对应的方案如下

按照给定的规则限制过滤去除点

通过常用滤波算法修改点的部分属性

对数据进行下采样

去除噪音

直通滤波(PassThrough 滤波)

最简单的一种滤波器,它的作用是过滤掉在指定维度方向上取值不在给定值域内的点。直通滤波器的实现原理如下:首先,指定一个维度以及该维度下的值域,其次,遍历点云中的每个点,判断该点在指定维度上的取值是否在值域内,删除取值不在值域内的点,最后,遍历结束,留下的点即构成滤波后的点云。直通滤波器简单高效,适用于消除背景等操作。

#include <pcl/filters/passthrough.h>

  如果使用线结构光扫描的方式采集点云,必然物体沿z向分布较广,

  但x,y向的分布处于有限范围内。

  此时可使用直通滤波器,确定点云在x或y方向上的范围,

  可较快剪除离群点,达到第一步粗处理的目的。

结果:

VoxelGrid滤波器对点云进行下采样

使用体素化网格方法实现下采样,即减少点的数量 减少点云数据,并同时保存点云的形状特征,在提高配准,曲面重建,形状识别等算法速度中非常实用,PCL是实现的VoxelGrid类通过输入的点云数据创建一个三维体素栅格,容纳后每个体素内用体素中所有点的重心来近似显示体素中其他点,这样该体素内所有点都用一个重心点最终表示,对于所有体素处理后得到的过滤后的点云,这种方法比用体素中心(注意中心和重心)逼近的方法更慢,但是对于采样点对应曲面的表示更为准确。

在网格内减少点数量保证重心位置不变

下采样 同时去除 NAN点

  如果使用高分辨率相机等设备对点云进行采集,往往点云会较为密集。

  过多的点云数量会对后续分割工作带来困难。

  体素格滤波器可以达到向下采样同时不破坏点云本身几何结构的功能。

  点云几何结构 不仅是宏观的几何外形,也包括其微观的排列方式,

  比如横向相似的尺寸,纵向相同的距离。

  随机下采样虽然效率比体素滤波器高,但会破坏点云微观结构.

  使用体素化网格方法实现下采样,即减少点的数量 减少点云数据,

  并同时保存点云的形状特征,在提高配准,曲面重建,形状识别等算法速度中非常实用,

  PCL是实现的VoxelGrid类通过输入的点云数据创建一个三维体素栅格,

  容纳后每个体素内用体素中所有点的重心来近似显示体素中其他点,

  这样该体素内所有点都用一个重心点最终表示,对于所有体素处理后得到的过滤后的点云,

  这种方法比用体素中心(注意中心和重心)逼近的方法更慢,但是对于采样点对应曲面的表示更为准确。

结果:

结果不太明显,换一个:

均匀采样 pcl::UniformSampling

这个类基本上是相同的,但它输出的点云索引是选择的关键点,是在计算描述子的常见方式。

  原理同体素格 (正方体立体空间内 保留一个点(重心点))

  而 均匀采样:半径求体内 保留一个点(重心点)

  #include <pcl/filters/uniform_sampling.h>//均匀采样

增采样 setUpsamplingMethod

增采样是一种表面重建方法,当你有比你想象的要少的点云数据时,

  增采样可以帮你恢复原有的表面(S),通过内插你目前拥有的点云数据,

  这是一个复杂的猜想假设的过程。所以构建的结果不会百分之一百准确,

  但有时它是一种可选择的方案。

  所以,在你的点云云进行下采样时,一定要保存一份原始数据!

statisticalOutlierRemoval滤波器移除离群点

作用是去除稀疏离群噪点。在采集点云的过程中,由于测量噪声的影响,会引入部分离群噪点,它们在点云空间中分布稀疏。在估算点云局部特征(例如计算采样点处的法向量和曲率变化率)时,这些噪点可能导致错误的计算结果,从而使点云配准等后期处理失败。统计滤波器的主要思想是假设点云中所有的点与其最近的k个邻居点的平均距离满足高斯分布,那么,根据均值和方差可确定一个距离阈值,当某个点与其最近k个点的平均距离大于这个阈值时,判定该点为离群点并去除。统计滤波器的实现原理如下:首先,遍历点云,计算每个点与其最近的k个邻居点之间的平均距离;其次,计算所有平均距离的均值μ与标准差σ,则距离阈值dmax可表示为dmax=μ+α×σ,α是一个常数,可称为比例系数,它取决于邻居点的数目;最后,再次遍历点云,剔除与k个邻居点的平均距离大于dmax的点。

#include <pcl/filters/statistical_outlier_removal.h>

  统计滤波器用于去除明显离群点(离群点往往由测量噪声引入)。

  其特征是在空间中分布稀疏,可以理解为:每个点都表达一定信息量,

  某个区域点越密集则可能信息量越大。噪声信息属于无用信息,信息量较小。

  所以离群点表达的信息可以忽略不计。考虑到离群点的特征,

  则可以定义某处点云小于某个密度,既点云无效。计算每个点到其最近的k(设定)个点平均距离

  。则点云中所有点的距离应构成高斯分布。给定均值与方差,可剔除n个∑之外的点

  激光扫描通常会产生密度不均匀的点云数据集,另外测量中的误差也会产生稀疏的离群点,

  此时,估计局部点云特征(例如采样点处法向量或曲率变化率)时运算复杂,

  这会导致错误的数值,反过来就会导致点云配准等后期的处理失败。

  解决办法:对每个点的邻域进行一个统计分析,并修剪掉一些不符合标准的点。

  具体方法为在输入数据中对点到临近点的距离分布的计算,对每一个点,

  计算它到所有临近点的平均距离(假设得到的结果是一个高斯分布,

  其形状是由均值和标准差决定),那么平均距离在标准范围之外的点,

  可以被定义为离群点并从数据中去除。

使用参数化模型投影点云

使用参数化模型投影点云

  如何将点投影到一个参数化模型上(平面或者球体等),

  参数化模型通过一组参数来设定,对于平面来说使用其等式形式。

  在PCL中有特定存储常见模型系数的数据结构。

投影前的Z轴都不为0 ,投影之后,打印的结果表明,xy的值都没有改变,z都变为0。所以该投影滤波类就是输入点云和投影模型,输出为投影到模型上之后的点云。

ConditionalRemoval 或 RadiusOutlinerRemoval 移除离群点

ConditionalRemoval 滤波器的理解

可以一次删除满足对输入的点云设定的一个或多个条件指标的所有的数据点

删除点云中不符合用户指定的一个或者多个条件的数据点

RadiusOutlierRemoval移除离群点

一个比较简单常用的方法就是根据空间点半径范围临近点数量来滤波,对应的类名是 RadiusOutlinerRemoval,这个很容易理解,它的滤波思想非常直接,就是在点云数据中,设定每个点一定半径范围内周围至少有足够多的近邻,不满足就会被删除。比如你指定了一个半径d,然后指定该半径内至少有1个邻居,那么下图中只有黄色的点将从点云中删除。如果指定了半径内至少有2个邻居,那么黄色和绿色的点都将从点云中删除。

  球半径滤波器与统计滤波器相比更加简单粗暴。

  以某点为中心 画一个球计算落在该球内的点的数量,当数量大于给定值时,

  则保留该点,数量小于给定值则剔除该点。

  此算法运行速度快,依序迭代留下的点一定是最密集的,

  但是球的半径和球内点的数目都需要人工指定。

3D,点云滤波到底滤了什么?

好的开始是成功的一半,获取到的数据越好,对算法的要求越低,最后处理得到的结果也越稳定。反之,如果一开始就是杂乱无章的数据,任你算法再牛,也终究逃不过异常值的情况,从而导致败北。

作为点云预处理的第一步,点云滤波扛起了大旗。

获取点云数据时,由于设备精度、操作者经验、环境因素、以及电磁波的衍射特性电磁波遇到障碍物时偏离原来直线传播的物理现象)等带来的影响,点云数据中将不可避免地出现一些坏分子1号——噪点;此外,实际应用时除了这些随机误差产生的噪点外,由于受到外界干扰如视线遮挡、障碍物等因素,点云数据中还会存在一些离主体点较远的坏分子二号——离散点

滤波大大就负责把这些坏分子抓起来,要么隔离,要么干掉,总之按照罪犯的危害等级高低,依次选择对应的过滤方法。其类似于信号处理中的滤波,但是具体实现手段又有些不一样,归结起来有如下几点:

1)点云不是函数,无法建立横纵坐标之间的关系

2)点云是空间离散的,不像图像信号有明显的定义域

3)点云在空间中分布广泛,建立点与点之间的关系较为困难

4)点云滤波依赖于集合信息而非数值信息

对于点云,我们常用的滤波手段有直通滤波器、体素滤波器、统计滤波器、半径滤波器等,我们通常组合使用。

直通滤波器

如果使用线结构光扫描的方式采集点云,必然物体沿z向分布较广ÿ

以上是关于点云滤波相关的主要内容,如果未能解决你的问题,请参考以下文章

点云滤波简介

MATLAB点云处理(二十四):点云中值滤波(pcmedian)

三维点云滤波对三维点云空间数据进行滤波的matlab仿真

MATLAB点云处理(二十四):点云中值滤波(pcmedian)

点云处理技术之PCL滤波器——直通滤波器(pcl::PassThrough)

点云处理技术之PCL滤波器——离群点滤波(statisticalOutlierRemovalConditionalRemoval 和RadiusOutlinerRemoval)