点云处理库中常见的几种滤波方法

本文介绍了点云处理库中常见的集中滤波方法,包括直通滤波器,体素滤波器,统计滤波器,半径滤波器。

1、直通滤波器

使用直通滤波器,确定点云在x或y方向上的范围,可较快去除一定范围为之外的点云,达到第一步粗处理的目的。

  pcl::PassThrough passthrough;
  passthrough.setInputCloud(cloud);//输入点云
  passthrough.setFilterFieldName("z");//对z轴进行操作
  passthrough.setFilterLimits(0.0, 1.0);//设置直通滤波器操作范围
  passthrough.setFilterLimitsNegative(true);//true表示保留范围内,false表示保留范围外
  passthrough.filter(*cloud_after_PassThrough);//执行滤波,

 坐标轴表示为红色(x)、绿色(y) 和蓝色(z)。这五个点用绿色表示过滤后剩余的点,红色表示已被过滤器删除的点。

点云处理库中常见的几种滤波方法_第1张图片

2、体素滤波器

体素的概念类似于像素,使用AABB包围盒将点云数据体素化,一般体素越密集的地方信息越多,噪音点及离群点可通过体素网格去除。另一方面如果使用高分辨率相机等设备对点云进行采集,往往点云会较为密集。过多的点云数量会对后续分割工作带来困难。体素滤波器可以达到向下采样同时不破坏点云本身几何结构的功能。 

 pcl::VoxelGrid sor;
 sor.setInputCloud (cloud);
 sor.setLeafSize (0.01f, 0.01f, 0.01f);
 sor.filter (*cloud_filtered);

体素滤波前

点云处理库中常见的几种滤波方法_第2张图片

体素滤波后 

点云处理库中常见的几种滤波方法_第3张图片

3、统计滤波器

统计滤波器主要用于去除明显离群点。 离群点特征在空间中分布稀疏。定义某处点云小于某个密度,既点云无效。计算每个点到其最近的k个点平均距离。

其大致的原理思路是:

  1. 对每个点,我们计算它到它的K邻域内所有点的平均距离d。对输入点云中的每个点都进行这样的计算,即每个点都可以求得其对应的d,因此可以得到一个包含各点d值的数组,记为distance。
  2. 对于输入点云中的所有点,假设得到distance数组中的各元素构成一个高斯分布,该数组即为一个样本,样本容量为点云包含的点数目。高斯分布曲线的形状由样本的均值和标准差决定,d值在标准范围(由样本的均值和方差定义)之外的对应点,可被定义为离群点并可从数据集中去除掉。
pcl::StatisticalOutlierRemoval sor;
sor.setInputCloud (cloud);
sor.setMeanK (50);
sor.setStddevMulThresh (1.0);
sor.filter (*cloud_filtered);

点云处理库中常见的几种滤波方法_第4张图片

 

4、半径滤波器

点云半径滤波也叫基于连通分析的点云滤波,该方法的基本思想是假定原始点云中每个激光点在指定的半径邻域中至少包含一定数量的近邻点。原始点云中符合假设条件的激光点被视为正常点进行保留,反之,则视为噪声点并进行去除。该方法对原始激光点云中存在的一些悬空的孤立点或无效点具有很好的去除效果。

        pcl::PointCloud::Ptr cloud_filter(new pcl::PointCloud);
        pcl::RadiusOutlierRemoval sor;
        sor.setInputCloud(cloud);
        sor.setRadiusSearch(0.02);
        sor.setMinNeighborsInRadius(15);
        sor.setNegative(false);
        sor.filter(*cloud_filter); 

 点云处理库中常见的几种滤波方法_第5张图片     点云处理库中常见的几种滤波方法_第6张图片

你可能感兴趣的:(算法)