PCL中的滤波(2)有的放矢的滤波

Posted by Ada on November 26, 2018

针对性的滤波

所谓针对性,建立在非常明确你不想要的噪声是什么,才能有的放矢。这一类的滤波器是我们很清楚的知道什么是我们不想要的。最常用的就是离群点的剔除。

1、直通滤波器 pcl::PassThrough直接指定保留哪个轴上的范围内的点

这个非常粗暴,划分好 X , Y, Z 方向, 给定范围值,就直接提出了不想要的点。慎用。

关键在于确定范围,必须要知道自己不想要的范围区间,在不知道的情况下也许还得先计算个包围盒。

官方demo

我这里的例子是直接砍掉了bunny的一半.pass_through_filters.png

2、球半径滤波器 去除离群点 去除离散点 pcl::RadiusOutlierRemoval。

这个意思也很简单,参数主要是半径 d 的设定与候选点 n。原理是以点云中的点为中心,确定一个半径为d的球体。计算该球体内含有的点的数量,数量大于n时候,这个点被保留,反之就被剔除。

RadiusOutlierRemoval.png

这是在我的数据下下离群点剔除:由于半径选区的不是那么准确,可能一些原有的非离群点也被滤掉了。

radiufilter_before.png

radiufilter_after.png

3、条件滤波器 pcl::ConditionalRemoval

顾名思义,满足条件的点被保留,反之剔除。

2和3的官方demo是写在一起的。代码看官方的就好

我摘了一下核心的。

//创建条件定义对象
pcl::ConditionAnd<pcl::PointXYZ>::Ptr range_cond(new pcl::ConditionAnd<pcl::PointXYZ>());
//为条件定义对象添加比较算子
range_cond->addComparison(pcl::FieldComparison<pcl::PointXYZ>::ConstPtr(new pcl::FieldComparison<pcl::PointXYZ>("z", pcl::ComparisonOps::GT, 0.0)));
//添加在Z字段上大于(pcl::ComparisonOps::GT great Then)0的比较算子
range_cond->addComparison(pcl::FieldComparison<pcl::PointXYZ>::ConstPtr(new pcl::FieldComparison<pcl::PointXYZ>("z", pcl::ComparisonOps::LT, 0.8)));
//添加在Z字段上小于(pcl::ComparisonOps::LT Lower Then)0.8的比较算子

可以理解为是直通滤波器的加强版,但是我想应该还有别的条件约束实现滤波,比如曲率。具体看点云文件中包含的信息,这个本质应该只是对点云文件本身的一些数值比较操作而实现的过滤。

这里我从x,y 方向各自切掉了bunny的一部分:

conditionalfilter.png

4、统计滤波器 pcl::StatisticalOutlierRemoval 去除明显离群点

官方demo

这个会稍微难理解一些。统计滤波器被用来剔除非常明显的离群点。这种点在空间中看去非常突出:“不合群!”

其本质是通过点云区域所反应的信息量来区分。点云越聚集的地方信息量越大,反之,噪声处越小。

于是定义如果某处点云小于一定密度阈值。则视为无效。以每个点与其邻近的 K 个点的平均距离作为密度度量。

理论上,点云中所有点的密度应该满足高斯分布(其形状是由均值和标准差决定)。于是密度在标准范围以外的点,即可剔除。

before_staticOutlier.png after_staticOutlier.png

下一篇中,我将介绍一些比较冷门的滤波器。至少我在没有读文档之前,都没有见过的。


本站总访问量: