参考链接:
https://yq.aliyun.com/ziliao/431359
点云数据时不可避免的存在噪声,或者离群点(离主体点云即被测物体点云较远的离散点)。
滤波是点云数据处理流程中的第一步,往往对后续处理管道影响很大,只有在滤波预处理中将噪声点、离群点、孔洞、数据压缩等按照后续处理定制,才能够更好的进行配准、特征提取、曲面重建、可视化等后续应用处理。
目录
一、滤波处理
点云滤波模块有多种滤波处理算法:双边滤波、高斯滤波、条件滤波、直通滤波、基于随机采样一致性滤波等。本工具中实现了直通滤波、体素化网格下采样、移除离群点、
体素化网格下采样
名词解释
体素化(Voxelization)是将物体的几何形式表示转换成最接近该物体的体素表示形式,产生体数据集,其不仅包含模型的表面信息,而且能描述模型的内部属性。表示模型的空间体素跟表示图像的二维像素比较相似,只不过从二维的点扩展到三维的立方体单元,而且基于体素的三维模型有诸多应用。
原理解释
使用VoxelGrid滤波器对点云进行下采样,即减少点的数量 减少点云数据,并同时保存点云的形状特征,在提高配准,曲面重建,形状识别等算法速度中非常实用,PCL是实现的VoxelGrid类通过输入的点云数据创建一个三维体素栅格,容纳后每个体素内用体素中所有点的重心来近似显示体素中其他点,这样该体素内所有点都用一个重心点最终表示,对于所有体素处理后得到的过滤后的点云,这种方法比用体素中心逼近的方法更慢,但是对于采样点对应曲面的表示更为准确。
原始点云与滤波后的点云可视化结果,明显的可以看出来,点的密度大小与整齐程度不同,处理后的数据量大大减小,很明显所含有的形状特征和空间结构信息与原始点云差不多。
参数解释:
参数 | 含义 |
LeafSize_x | 体素立方体边长x、y、z,三个参数都为0.1的话,就表示体素体积为1cm的立方体,值越大,最终保留的点数越少。大场景建议最小设置到10 |
LeafSize_y | |
LeafSize_z |
移除离群点
名词解释(应用场景)
使用统计分析技术,从一个点云数据中集中移除测量噪声点(也就是离群点)比如:激光扫描通常会产生密度不均匀的点云数据集,另外测量中的误差也会产生稀疏的离群点,使效果不好,估计局部点云特征(例如采样点处法向量或曲率变化率)的运算复杂,这会导致错误的数值,反过来就会导致点云配准等后期的处理失败。
原理解释
每个点的邻域进行一个统计分析,并修剪掉一些不符合一定标准的点,稀疏离群点移除方法基于在输入数据中对点到临近点的距离分布的计算,对每一个点,计算它到它的所有临近点的平均距离,假设得到的结果是一个高斯分布,其形状是由均值和标准差决定,平均距离在标准范围之外的点,可以被定义为离群点并可从数据中去除。
参数解释
|
|
|
"MeanK"
| The number of points to use for mean distance estimation 平均距离估计的点数,在进行统计时考虑查询点临近点数 | 对每个点分析的临近点的个数设置为50 ,并将标准差的倍数设置为1 这意味着如果一个点的距离超出了平均距离一个标准差以上,则该点被标记为离群点,并将它移除,存储起来 |
"stddev_mult" | 设置判断是否为离群点的阀值 |
投影滤波
原理解释
将点投影到一个参数化模型上(平面或者球体等),对于平面来说使用其等式形式,本工具中使用的参数化模型为ax+by+cz+d=0平面模型,假设a=b=d=0,c=1 也就表明投影到X-Y平面,投影之后,xy的值都没有改变,z值都变为0
参数解释
|
|
|
A | ax+by+cz+d=0的系数 | 1.0.0.0:x=0平面 0.0.1.0:z=0 平面 |
B | ||
C | ||
D |
直通滤波
直通滤波器对原始点云数据进行滤波处理。通过直通滤波器可以将某一轴向上的,比如Z轴方向上范围之外的点滤除(在背景与前景有一定距离的情况下,可以除掉背景)
二、特征点提取
常见的三维点云关键点提取算法有一下几种:ISS3D、Harris3D、NARF、SIFT3D这些算法在PCL库中都有实现,其中NARF算法是用的比较多的。
https://blog.csdn.net/xiaoxiaowenqiang/article/details/79575126
边缘点
参数解释:
arg_kNearest = 30;//一般这里的数值越高,最终边界识别的精度越好
arg_Angle = 144;//角度值,0-360
https://blog.csdn.net/ScarecrowLiu/article/details/51841755 这里有详细的原理解释
Harris
角点:水平、竖直方向上变化均较大的点
对比而言,边缘是仅在水平或者仅在竖直方向上有较大的变化,平坦地区则是水平、竖直变化均较小。
一般来说特征检测都会对曲率变化比较剧烈的点更敏感。Harris算法是图像检测识别算法中非常重要的一个算法,其对物体姿态变化鲁棒性好,对旋转不敏感,可以很好的检测出物体的角点
原理解释:
1.在图像中取一个窗 w (矩形窗,高斯窗等)
2.获得在该窗下的灰度 I
3.移动该窗,则灰度会发生变化,平坦区域灰度变化不大,边缘区域沿边缘方向灰度变化剧烈,角点处各个方向灰度变化均剧烈
4.依据3中条件选出角点
https://www.cnblogs.com/klitech/p/5779600.html
https://www.cnblogs.com/ironstark/p/5064848.html (这里有公式)
参数解释
//角分辨率
float angularResolution = (float) ( 1.0f * (M_PI/180.0f)); // 1.0 degree in radians
//phi可以取360°
float maxAngleWidth = (float) (360.0f * (M_PI/180.0f)); // 360.0 degree in radians
//a取180°
float maxAngleHeight = (float) (180.0f * (M_PI/180.0f)); // 180.0 degree in radians
//半圆扫一圈就是整个图像了
|
|
|
"radius" | radius the radius for normal estimation as well as for non maxima suppression |
|
"threshold” | threshold the threshold to filter out weak corners |
|
ISS
名词解释
ISS算法的全称是Intrinsic Shape Signatures,使用局部坐标系建模分析,这种局部坐标系建模分析的方法是基于特征值分析的特征点提取的方法。
原理描述:
1、 第一步,建模
a.把pi和周围点pj的坐标相减:本质上这生成了许多从pi->pj的向量, 理想情况下pi的法线应该是垂直于这些向量的
b.利用奇异值分解求这些向量的0空间,拟合出一个尽可能垂直的向量,作为法线的估计
2.第二步,其利用特征值之间关系来形容该点的特征程度。
显然这种情况下的特征值是有几何意义的,特征值的大小实际上是椭球轴的长度。
椭球的的形态则是对邻近点分布状态的抽象总结。
试想,如果临近点沿某个方向分布致密则该方向会作为椭球的第一主方向, 稀疏的方向则是第二主方向,法线方向当然是极度稀疏(只有一层),那么则作为第三主方向。
如果某个点恰好处于角点,则第一主特征值,第二主特征值,第三主特征值大小相差不会太大。
如果点云沿着某方向致密,而垂直方向系数则有可能是边界。总而言之,这种局部坐标系建模分析的方法是基于特征值分析的特征点提取
更详细的描述如下:
SS关键点检测器在场景中的每个点周围找到支持区域的协方差矩阵的特征值M1,M2和M3(以递减幅度)。
假设存在值iss_gamma_21 _和iss_gamma_32_,计算方法如下所示。
iss_gamma_21_ = M2/M1
iss_gamma_32_ = M3/M2
估计的iss_gamma_21_和iss_gamma_32_小于用户设定阈值的点,然后将这些点传递到下一阶段,其中基于最小特征值估计显着性,并且执行非最大抑制以找到最终关键点集合。
现在,如果我们将阈值iss_gamma_21 _和iss_gamma_32_设置为0.9之类比较高的值,则所有点都通过第一阶段的提取的点,这是基于用户设置的阈值。 这是因为很可能M2 / M1 <0.9且M3 / M2 <0.9,这样无法提供有效提取策略“This does not offer efficient pruning strategy of unreliable points”。
因此这些不可靠的点才通过了第一阶段。接下来,从这些点集中,通过non-maximum检测可以最终确定的一组关键点。
虽然这些点在邻域方差和结构测试中提供了良好的性能,但它并没有转化为具有稀疏深度测量的良好姿态估计。
总结:
基本上,ISSKeypoint3D detector.可以运行两种不同的模式:没有边界估计和随着边界估计。
参数
model_resolution:一个基数。是程序中用到的两个参数的基数
salient_radius:the radius of the spherical neighborhood。6 * model_resolution
Set the radius for the application of the non maxima supression algorithm
均为必须的参数:salient radius (严格为正)、maxima suppression radius (严格为正)、border radius (边界半径,默认值0.0)
http://docs.pointclouds.org/trunk/classpcl_1_1_i_s_s_keypoint3_d.html#abd04154f4b62ac83bdc6811b433522de 这里是pcl库提供的参数列表
SIFT
名词解释
SIFTKeypoint是将二维图像中的SIFT算子调整后移植到3D空间的SIFT算子的实现,SIFT(Scale-invariant feature transform)是一种检测局部特征的算法,该算法通过求一幅图中的特征点(interest points,or corner points)及其有关scale 和 orientation 的描述子得到特征并进行图像特征点匹配
这个算法具有比较良好的尺度不变性和旋转不变形
原理描述
通俗一点说,SIFT算法利用DoG(差分高斯)来提取关键点(或者说成特征点),DoG的思想是用不同的尺度空间因子(高斯正态分布的标准差σ)对图像进行平滑,然后比较平滑后图像的区别,差别大的像素就是特征明显的点,即可能是特征点。对得到的所有特征点,我们剔除一些不好的,SIFT算子会把剩下的每个特征点用一个128维的特征向量进行描述。由上,易知,一幅图像经过SIFT算法后可以表示为一个128维的特征向量集。
SIFT具有以下特征:
1、SIFT特征,对旋转、尺度缩放、亮度变化等保持不变性,对视角变换、仿射变化、噪声也保持一定程度的稳定性,是一种非常优秀的局部特征描述算法;
2、独特性好,信息量丰富,适用于海量特征库进行快速、准确的匹配;
3、多量性,即使是很少几个物体也可以产生大量的SIFT特征;
4、高速性,经优化的SIFT匹配算法甚至可以达到实时性的要求;
5、扩展性,可以很方便的与其他的特征向量进行联合。
1、SIFT特征检测的步骤
尺度空间的极值检测:搜索所有高斯尺度空间上的图像,通过高斯差分函数(DoG)来识别潜在的对尺度和选择不变的兴趣点。
关键点的定位和过滤:在每个候选的位置上,通过一个拟合精细模型来确定位置尺度,关键点的选取依据他们的稳定程度。
特征方向赋值:基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向,后续的所有操作都是对于关键点的方向、尺度和位置进行变换,从而提供这些特征的不变性。
特征点描述:在每个特征点周围的邻域内,在选定的尺度上测量图像的局部梯度,这些梯度被变换成一种表示,这种表示允许比较大的局部形状的变形和光照变换。
2、尺度空间
在一定的范围内,无论物体是大还是小,人眼都可以分辨出来。然而计算机要有相同的能力却不是那么简单的事情,在未知的场景中,计算机视觉并不能提供物体的尺度大小,其中的一个方法就是把物体不同尺寸下的图像都提供给机器,让机器能够对物体再不同的尺度下有一个统一的认知。在建立统一认知的过程中,要考虑的就是图像在不同的尺度下都存在的特征点。
参数解释
输入带有XYZ坐标值和强度的点云,输出为点云中的SIFT关键点,其关键函数的说明如下:
|
|
min_scale | 在点云体素尺度空间中标准偏差 |
nr_octaves | 检测关键点时体素空间尺度的数目 |
nr_scales_per_octave | 每一个体素空间尺度下计算高斯空间的尺度所需要的参数 |
min_contrast | 候选关键点对应的对比度下限 |
NARF
名词解释:
NARF(Normal Aligned Radial Feature)关键点是为了从深度图像中识别物体而提出的,对NARF关键点的提取过程有以下要求:
a)提取的过程考虑边缘以及物体表面变化信息在内;
b)在不同视角关键点可以被重复探测;
c)关键点所在位置有足够的支持区域,可以计算描述子和进行唯一的估计法向量。
计算原理:
(1) 遍历每个深度图像点,通过寻找在近邻区域有深度变化的位置进行边缘检测。
(2) 遍历每个深度图像点,根据近邻区域的表面变化决定一测度表面变化的系数,及变化的主方向。
(3) 根据step(2)找到的主方向计算兴趣点,表征该方向和其他方向的不同,以及该处表面的变化情况,即该点有多稳定。
(4) 对兴趣值进行平滑滤波。
(5) 进行无最大值压缩找到的最终关键点,即为NARF关键点。
参数:
|
|
"angular_resolution" | 角坐标分辨率,模拟的深度传感器的角度分辨率,即深度图像中一个像素对应的角度大小 |
"maxAngleWidth" | 模拟的深度传感器的水平最大采样角度 |
"maxAngleHeight" | 模拟传感器的垂直方向最大采样角度 |
"noise_level" | noise_level获取深度图像深度时,近邻点对查询点距离值的影响水平 |
"min_range " | min_range设置最小的获取距离,小于最小获取距离的位置为传感器的盲区 |
“border_size” | border_size获得深度图像的边缘的宽度 |
"support_size" | //感兴趣点的尺寸(球面的直径) |