本博客内容来源于网络以及其他书籍,结合自己学习的心得进行重编辑,因为看了很多文章不便一一标注引用,如图片文字等侵权,请告知删除。
前言
正好公司需要让总结一下,常见的点云滤波算法,作为实习生学习的资料,趁此将其记录成文, 只是简介。
常见点云滤波
点云滤波作为常见的点云处理算法,一般是点云处理的第一步,对后续处理有很重要作用。滤波有很多方面也有很多种功能,比如去除噪声点、离群点、点云平滑以及空洞、数据压缩等。下面我们来列举一下,我们在开源项目中可以找到的滤波算法:
- 直通滤波器
- 体素滤波器
- 统计滤波器
- 条件滤波
- 半径滤波器
- 双边滤波
- 高斯滤波
- 均匀采样滤波
- 移动最小二乘法光滑滤波
- 基于权重局部优化投影 (WLOP) 简化算法
- DoN算法
- 以及各种通过规则进行点调整或者删除的都可以成为滤波算法
下面对上面列举出来的一部分进行解释。
滤波算法原理
-
直通滤波器
直通滤波器就是根据点云的属性(属性比如x,y,z,颜色值等),在点的属性上设置范围,对点进行滤波,保留范围内的或保留范围外的。
举例:在一个rgbd数据中,只想保留深度值小于5米的数据,就可以通过直通滤波器来保留z属性小于5米的点云。
开源代码库:PCL
示例代码链接 --> 传送门
-
体素滤波器
体素的概念类似于像素,使用AABB包围盒将点云数据体素化,根据体素中的点,计算出代表这个体素的点,达到下采样的目的。体素滤波器可以达到向下采样同时不破坏点云本身几何结构的功能,但是会移动点的位置。此外体素滤波器可以去除一定程度的噪音点及离群点。主要功能是用来进行降采样。
特点:可以将点云降采样至同一间距,初始密度影响不大,主要根据设置体素的大小。
开源代码库:PCL
示例代码链接 --> 传送门
-
均匀采样滤波
均匀采样滤波基本上等同于体素滤波器,但是其不改变点的位置。下采样后,其点云分布基本均匀,但是其点云的准确度要好于体素滤波,因为没有移动点的位置。
开源代码库:PCL
示例代码链接 --> 传送门
-
统计滤波器
统计滤波器用于去除明显离群点。离群点特征是在空间中分布稀疏。考虑到离群点的特征,则可以定义某处点云小于某个密度,既点云无效。计算每个点到其最近的k个点平均距离。则点云中所有点的距离应构成高斯分布。根据给定均值与方差,可剔除方差之外的点。即使方差之外的点是正确点,但是其太稀疏,带来的信息也是很少的。
特点:主要是根据密度去除离群点,对密度差异较大的离群点去除效果较好。
开源代码库:PCL
示例代码链接 --> 传送门
-
条件滤波
条件滤波器通过设定滤波条件进行滤波,有点分段函数的味道,当点云在一定范围则留下,不在则舍弃。直通滤波器是一种较简单的条件滤波器。条件滤波器更像是一个不带有滤波核的工具。
示例代码链接 --> 传送门
开源代码库:PCL
-
半径滤波器
半径滤波器与统计滤波器相比更加简单粗暴。以某点为中心画一个圆计算落在该圆中点的数量,当数量大于给定值时,则保留该点,数量小于给定值则剔除该点。此算法运行速度快,依序迭代留下的点一定是最密集的,但是圆的半径和圆内点的数目都需要人工指定。
主要还是用于去除离群点,在一定程度上可以用来筛选边缘点。
开源代码库:PCL
示例代码链接 --> 传送门
-
高斯滤波
高斯滤波是一种非线性滤波器,采用加权平均的方式。在指定域内的权重是根据欧式距离的高斯分布,通过权重加权平均的方式得到当前点的滤波后的点。
特点:高斯滤波平滑效果较好但是边缘角点也会被较大的平滑。
开源代码库:PCL
pcl::PointCloud<pcl::PointXYZRGB>::Ptr inputCloud,cloud;
pcl::filters::Convolution<pcl::PointXYZRGB, pcl::PointXYZRGB> convolution;
Eigen::ArrayXf gaussian_kernel(5);
gaussian_kernel << 1.f/16, 1.f/4, 3.f/8, 1.f/4, 1.f/16;
convolution.setBordersPolicy(
pcl::filters::Convolution<pcl::PointXYZRGB, pcl::PointXYZRGB>::BORDERS_POLICY_IGNORE);
convolution.setDistanceThreshold (static_cast<float> (0.1));
convolution.setInputCloud (inputCloud);
convolution.setKernel (gaussian_kernel);
convolution.convolve(*cloud);
-
双边滤波
双边滤波是一种非线性滤波器,它可以达到保持边缘、降噪平滑的效果。一定程度上拟补了高斯滤波的缺点。双边滤波对高斯噪声效果比较好。
双边滤波从单纯的考虑空间域点的位置的高斯滤波上,又加上一个维度上的权重。在点云处理上,可以叫做为特征域,即当前点的法向量与临近点的法向量。通过改变两个域上的高斯滤波的方差来平衡平滑效果以及保持边缘的效果。具体的公式也需要一篇文章来解释。
开源代码库:CGAL,PCL(两个实现的方式不同,CGAL的效果更好)
示例代码链接 --> 传送门1 传送门2
-
移动最小二乘法光滑滤波
移动最小二乘法光滑滤波思路很简单,就是根据点云,找到一个函数,这个函数有一系列的局部的函数组成(这个工作是通过移动最小二乘法完成的,可能需要一篇文章来解释移动最小二乘法),这个函数的特性是光滑的,然后将点投影到函数上,就完成了平滑的目的。
开源代码库:PCL、VCGLIB、CGAL
示例代码链接 --> 传送门
-
基于权重局部优化投影 (WLOP) 简化算法
wlop是一种点云增强方法,可以消除噪声、删除外点并得到均匀的采样密度。这个原理比较复杂,暂时还没看懂其实现流程。先看一张效果图:
开源代码库:CGAL
示例代码链接 --> 传送门
-
DoN算法
DoN(Difference of Normal),利用了多尺度空间的思想,算法的目的是在去除点云低频滤波(或者保留高频信息),低频信息(例如建筑物墙面,地面)往往会对分割产生干扰,高频信息(例如建筑物窗框,路面障碍锥)往往尺度上很小,直接采用基于临近信息的滤波器会将此类信息合并至墙面或路面中。算法如下:
- 在小尺度上计算点云法线1
- 在大尺度上计算点云法线2
- 法线1-法线2
- 滤去3中值较小的点(低频信息,较平坦的部分,如墙面地面等)
- 欧式分割(将高频信息分开)
此算法的目的可以较好的分开高频信息和低频信息。
开源代码库:PCL(没有直接实现,很容易实现)
示例代码链接 --> 传送门
总结
所谓滤波器,其实主要通过局部计算的方式,获得一个响应值,然后根据响应值调整点云,比如位置调整,保留或删除某点。跟图像上的滤波器思想还是一样的,只不过在点云里面,存在无序点云罢了。
当没有一个滤波器能完整达到要求时,我们通过组装多个滤波器达到更复杂的功能。偏向应用的算法工程师可能完成一个需求要叠加很多个滤波器,其实CNN不也是一堆滤波器的组装嘛。
还有蛮多算法不懂的,赶快学习吧小伙子。
重要的事情说三遍:
如果您看到我的文章对您有所帮助,那就点个赞呗 ( * ^ __ ^ * )
如果您看到我的文章对您有所帮助,那就点个赞呗( * ^ __ ^ * )
如果您看到我的文章对您有所帮助,那就点个赞呗( * ^ __ ^ * )
任何人或团体、机构全部转载或者部分转载、摘录,请保留本博客链接或标注来源。博客地址:开飞机的乔巴
作者简介:开飞机的乔巴(WeChat:zhangzheng-thu),现主要从事机器人抓取视觉系统以及三维重建等3D视觉相关方面,另外对slam以及深度学习技术也颇感兴趣,欢迎加我微信或留言交流相关工作。