点云滤波相关

点云滤波相关,第1张

复制于: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点云数据的预处理是利用有效点云信息进行三维重建及障碍物感知的基础,是3D点云配准、3D点云拼接环节的前提。一般的 3D 点云预处理工作包括地面点云去除、点云滤波和点云分割。在三维点云数据处理过程中,点云数据离群点、噪声点的剔除以及点云数据的配准不仅是点云数据处理中的重要环节,也是后期对点云数据进行特征提取完成检测环节的基础。

        在进行目标物体分割时,将离散的三维数据点聚类的判断依据为点与点之间距离是否接近,而在激光雷达点云数据中,有很大一部分数据属于地面点数据,并且地面点云呈现为纹理状,这对后续障碍物点云的分类,识别带来干扰,如果不将这些地面点数据去除,在进行目标物体分割时会导致分割算法失效,因此需要先进行过滤。所以,地面点云数据去除是减少数据量以及提高分割算法准确度的有效手段。

       因此为了提高去除地面点云算法的准确性和鲁棒性,许多学者提出了大量研究方法,这些方法主要有以下两类:基于栅格图方法的地面去除研究、基于三维激光雷达原始扫描线数据的地面去除研究。

       通过激光雷达扫描得到的点云包含大部分地面点,常用的栅格图方法地面滤除点云方法有栅格高度差法、法向量方法和高度法。栅格高度法首先根据栅格大小生成网格,计算每个网格最低点与最高点的高度差,比较h与预设高度差阈值大小,对网格进行分类,最后根据网格对网格内的点进行分类。法向量法是基于计算出地面法向量为竖直向下或向上的假设,即地面点法向量值为(0,0,1)或(0,0,-1)。方法过程是计算点法向量并设定点分类的法向量阈值。高度法去除地面点云,是最常用且耗时最小的方法。根据激光雷达安装位置与姿态,可以根据设定阈值直接将点云分为地面点和障碍物点。

       基于栅格图的点云处理方式是通过将三维点云数据投影到地面,建立多个栅格单元,采用连通区域标记算法或者邻域膨胀策略对目标进行聚类,这类方法被广泛应用在激光雷达三维建模中。一是因为三维点云向二维平面投影过程极大地压缩了数据量,能够提高算法处理的实时性;二是因为点云向栅格图的映射,将复杂的三维点云处理问题转化为图像处理问题,可以使用成熟的图像处理相关算法,提高了算法处理的时间效率。栅格法简单可靠、计算效率高,但是栅格单元参数固定且往往凭经验确定,远距离目标点云较为稀疏往往会出现过分割,而近距离目标点云较为稠密又会出现欠分割,算法严重依赖于阈值参数的选择,且往往需要逐帧进行分析,必然损失部分实时性。

       由于三维激光雷达的原始三维数据包含了详细的空间信息,所以也可以用来进行相关点云数据处理。激光扫描线在地面和障碍物形成的角度值存在显著的不同,可作为分离地面点的重要依据。激光雷达中的多个激光器水平扫描周围环境中的物体,在两个相邻物体之间形成的角度很小,而同一物体的角度值很大。这启示了我们可以充分利用这一特性,大于角度阈值可认为这两点是同一物体,较好地处理了相邻目标欠分割的问题。通过将非地面点云分割为不同物体,然后进行目标物体的识别,可以为无人车提供更加详细的车辆、行人等障碍物信息,在运动中避免与不同类型的障碍物发生碰撞并进行及时避让。地面点云欠分割会导致目标漏检,过分割又会对后续的识别等 *** 作带来影响。利用激光雷达产生点云的几何特性,研究人员提出了多种特征构建的方法,基于三维激光雷达原始扫描线数据的地面去除研究属于其中较为常用的方法。

       激光雷达在采集三维点云数据的过程中,会受到各类因素的影响,所以在获取数据时,就会出现一些噪声。其实在实际工作中除了自身测量的误差外,还会受到外界环境的影响如被测目标被遮挡,障碍物与被测目标表面材质等影响因素;另外,一些局部大尺度噪声由于距离目标点云较远,无法使用同一种方法对其进行滤波。

       噪声就是与目标信息描述没有任何关联的点,对于后续整个三维场景的重建起不到任何用处的点。但是在实际的点云数据处理算法中,把噪声点和带有特征信息的目标点区别开来是很不容易的,去噪过程中由于许多外在因素总是不可避免的伴随着一些特征信息的丢失。一个好的点云滤波算法不仅实时性要求高,而且在去噪的同时也要很好的保留模型的特征信息[88]。就需要把点云数据的噪声点特征研究透彻,才能够提出效果更好的去噪算法。

       点云数据是一种非结构化的数据格式,激光雷达扫描得到的点云数据受物体与雷达距离的影响,分布具有不均匀性,距离雷达近的物体点云数据分布密集,距离雷达远的物体点云数据分布稀疏。此外,点云数据具有无序和非对称的特征,这就导致点云数据在数据表征时缺乏明确统一的数据结构,加剧了后续点云的分割识别等处理的难度。神经网络作为一种端到端的网络结构,往往处理的数据是常规的输入数据,如序列、图像、视频和3D数据等,无法对点集这样的无序性数据直接进行处理,在用卷积 *** 作处理点云数据时,卷积直接将点云的形状信息舍弃掉,只对点云的序列信息进行保留。

       点云滤波是当前三维重建技术领域的研究热点,同时也是许多无人驾驶应用数据处理过程中至关重要的一步。3D点云滤波方法主要可以分为以下三类,主要包括基于统计滤波、基于邻域滤波以及基于投影滤波。

       由于统计学概念特别符合点云的特性,因此,许多国内外学者都将统计学方法引用到点云滤波技术中,Kalogerakis 等人将一种稳健统计模型框架运用到点云滤波中,取得了非常好的滤波效果。在这个统计模型框架中,通过使用最小二乘迭代方法来估计曲率张量,并在每次迭代的时候根据每个点周围的领域来为样本分配权重,从而细化每个点周围的每一个邻域。然后利用计算获得的曲率以及统计权重来重新校正正态分布。通过全局能量的最小化并通过计算出的曲率和法线来把离群点去掉,并且能较好的保持点云的纹理特征。

       基于邻域的点云滤波技术,就是通过使用一种相似性度量的方法来度量点和其他周围邻域对滤波效率与结果影响比较大点的相似性,从而来确定滤波点的位置。一般来说,可以通过点云的位置、法线和区域位置来度量其相似性。1998年,Tomasi等人将双边滤波器扩展到 3D 模型去噪,由于双边滤波器具有维持边缘平滑的特点,所以在除去点云数据噪声的同时也能较好的保持细节。但是,由于该方法是通过一个网格生成的过程来去噪的,而在生成网格的过程就会引入额外的噪声。相比较于规则格网、不规则三角网等数据结构,体元是真3D的结构并且隐含有邻域关系,能够有效的防止生成网格的过程中引入噪声,但该方法的需要设置的参数比较多,不能满足实际工业运用。

       基于投影滤波技术通过不同的投影测量来调整点云中每个点的位置,从而实现噪声点云的去除。但是,如果输入的点云特别不均匀,经过局部最优投影处理后的点云将变得更散乱。孙渡等人提出了一种基于多回波及 Fisher 判别的滤波算法。首先结合格网划分思想划分点云网格,在每个网格内,通过点云数据的回波次数和强度进行划分,分出待定的样本;其次,利用Fisher判别的分析法将点云投影到一维空间内,通过判定临界值将植被点云与地面点云分离,实现陡坡点云的滤波,但是,该方法只针对点云中含有回波强度的属性才有效,对于不包含回波强度信息的点云,该方法失去作用。

       为弥补点云本身的无序性、不对称性、非结构化和信息量不充分等缺陷,在对点云进行特征识别及语义分割等 *** 作之前,需先对点云进行数据形式的变换 *** 作。常用的点云形式变换方法有网格化点云、体素化点云、将点云进行球面映射等。

       体素化是为了保持点云表面的特征点的同时滤除不具备特征的冗余的点云数据。由于常用的法向量计算取决于相邻点的数量,并且两个云点的分辨率也不同。所以具有相同体素大小的体素化就是为了在两个不同分辨率的点云中生成等效的局部区域。在实际进行点云配准算法的过程中,由于用于配准的源点云数据与目标点云数据的数量比较庞大、点云密集,并且这些原始点云数据中含有许多点云对于描述物体形状特征没有任何作用的点,如果使用算法直接对源点云与目标点云进行配置的话,整个过程将耗费大量时间,所以必须对点云进行下采样的同时仍保留住可以体现形状轮廓特征的那部分点云。

       由于点云本身的稀疏性、无序性和非均匀分布的特点,在利用深度全卷积神经网络结构对激光雷达点云数据进行语义分割时,端到端的卷积神经网络无法直接对无序排布点云进行 *** 作。为使端到端的神经网络在无序性分布的点云数据上具有通用性,需先对点云数据进行映射,常见的投影方式有基于平面的投影、基于圆柱面的投影以及基于球面的点云投影方式。

参考:

周天添等(基于深度神经网络的激光雷达点云语义分割算法研究)

李宏宇(激光雷达的点云数据处理研究)

范小辉(基于激光雷达的行人目标检测与识别)

25、基于真实数据集的离群点检测

import numpy as np

from sklearn.covariance import EllipticEnvelope

from sklearn.svm import OneClassSVM

import matplotlib.pyplot as plt

import matplotlib.font_manager

from sklearn.datasets import load_wine

plt.rcParams['font.sans-serif'] = ['SimHei']

plt.rcParams['axes.unicode_minus'] = False

# 定义要使用的“分类器”

classifiers = {

    "Empirical Covariance": EllipticEnvelope(support_fraction=1.,

                                            contamination=0.25),

    "Robust Covariance (Minimum Covariance Determinant)":

    EllipticEnvelope(contamination=0.25),

    "OCSVM": OneClassSVM(nu=0.25, gamma=0.35)}

colors = ['m', 'g', 'b']

legend1 = {}

legend2 = {}

# 获取数据

X1 = load_wine()['data'][:, [6, 9]]  # 两簇

#利用多个分类器学习离群点检测的前沿

xx1, yy1 = np.meshgrid(np.linspace(-1, 5.5, 500), np.linspace(-2.5, 19, 500))

for i, (clf_name, clf) in enumerate(classifiers.items()):

    plt.figure(1)

    clf.fit(X1)

    Z1 = clf.decision_function(np.c_[xx1.ravel(), yy1.ravel()])

    Z1 = Z1.reshape(xx1.shape)

    legend1[clf_name] = plt.contour(

        xx1, yy1, Z1, levels=[0], linewidths=2, colors=colors[i])

legend1_values_list = list(legend1.values())

legend1_keys_list = list(legend1.keys())

# 绘制结果(数据点云的形状)

plt.figure(1)  # 两簇

plt.title("基于真实数据集的离群点检测(葡萄酒识别)")

plt.scatter(X1[:, 0], X1[:, 1], color='black')

plt.xlim((xx1.min(), xx1.max()))

plt.ylim((yy1.min(), yy1.max()))

plt.legend((legend1_values_list[0].collections[0],

            legend1_values_list[1].collections[0],

            legend1_values_list[2].collections[0]),

          (legend1_keys_list[0], legend1_keys_list[1], legend1_keys_list[2]),

          loc="upper center",

          prop=matplotlib.font_manager.FontProperties(size=11))

plt.ylabel("color_intensity")

plt.xlabel("flavanoids")

plt.show()


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11723363.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存