点云滤波是点云处理的基本步骤,也是进行high level三维图像处理之前必要的预处理。其类似于信号处理中的滤波,单实现手段却和信号处理不一样,主要有以下几方面原因:
- 点云不是函数,无法建立横纵坐标之间的关系
- 点云在空间中是离散的,不像图像信号有明显的定义域
- 点云在空间中分布广泛,建立点与点之间的关系较为困难
- 点云滤波依赖于集合信息而非数值信息
点云滤波方法主要有直通滤波器、体素格滤波器、统计滤波器、半径滤波器等,通常组合使用完成任务。
直通滤波器
如果使用线结构光扫描的方式采集点云,必然物体沿z向分布较广,但x,y向的分布处于有限范围内。此时可使用直通滤波器,确定点云在x或y方向上的范围,可较快剪除离群点,达到第一步粗处理的目的。
// Create the filtering object pcl::PassThrough<pcl::PointXYZ> pass; pass.setInputCloud (cloud); pass.setFilterFieldName ("z"); pass.setFilterLimits (0.0, 1.0); //pass.setFilterLimitsNegative (true); pass.filter (*cloud_filtered);
体素格滤波器
如果使用高分辨率相机等设备对点云进行采集,往往点云会较为密集。过多的点云数量会对后续分割工作带来困难。体素格滤波器可以达到向下采样同时不破坏点云本身几何结构的功能。点云几何结构不仅是宏观的几何外形,也包括其微观的排列方式,比如横向相似的尺寸,纵向相同的距离。随机下采样虽然效率比体素滤波器高,但会破坏点云微观结构
// Create the filtering object pcl::VoxelGrid<pcl::PCLPointCloud2> sor; sor.setInputCloud (cloud); sor.setLeafSize (0.01f, 0.01f, 0.01f); sor.filter (*cloud_filtered);
统计滤波器
统计滤波器用于去除明显离群点(离群点往往由测量噪声引入)。其特征是在空间中分布稀疏,可以理解为:每个点都表达一定信息量,某个区域点越密集则可能信息量越大。噪声信息属于无用信息,信息量较小。所以离群点表达的信息可以忽略不计。考虑到离群点的特征,则可以定义某处点云小于某个密度,既点云无效。计算每个点到其最近的k个点平均距离。则点云中所有点的距离应构成高斯分布。给定均值与方差,可剔除3∑之外的点
// Create the filtering object pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor; sor.setInputCloud (cloud); sor.setMeanK (50); sor.setStddevMulThresh (1.0); sor.filter (*cloud_filtered);
半径滤波器
半径滤波器与统计滤波器相比更加简单粗暴。以某点为中心画一个圆计算落在该圆中点的数量,当数量大于给定值时,则保留该点,数量小于给定值则剔除该点。此算法运行速度快,依序迭代留下的点一定是最密集的,但是圆的半径和圆内点的数目都需要人工指定。
// build the filter pcl::RadiusOutlierRemoval<pcl::PointXYZ> outrem; outrem.setInputCloud(cloud); outrem.setRadiusSearch(0.8); outrem.setMinNeighborsInRadius (2); // apply filter outrem.filter (*cloud_filtered);
双边滤波
pcl::BilateralFilter<PointT>
空间剪裁
pcl::Clipper3D<PointT>
pcl::BoxClipper3D<PointT>
pcl::CropBox<PointT>
pcl::CropHull<PointT> 剪裁并形成封闭曲面
卷积滤波
pcl::filters::Convolution<PointIn, PointOut>
pcl::filters::ConvolvingKernel<PointInT, PointOutT>
实现将两个函数通过数学运算产生第三个函数,可以设定不同的卷积核
您好,想请教您,我是用的ToF相机获取的点云数据,以您的经验,用哪种滤波比较好
另外,我是用深度图像做目标跟踪,您觉得我前期处理用滤波,特征点提取,特征描述,这三个可以吗
谢谢
离群点多的话用半径滤波,数据特点不一样没有说哪种好,都是试出来的
可以
非常感谢
你好,我有一个点云数据,但是显示出来什么都看不清楚,做了一个体素网格滤波,效果都不是很好,自己怀疑数据源有问题,你这边可以给个数据源吗?
您好,我想问一下这个空间剪裁中这些
pcl::Clipper3D
pcl::BoxClipper3D
pcl::CropBox
pcl::CropHull 剪裁并形成封闭曲面
怎么用呀???,谢谢,请回复
博主,您好。非常感谢您的总结分享,我想问一下pcl库中的卷积滤波是什么原理呢?怎么编程实现呢?适用于什么样的数据呢?有没有类似与opencv库中膨胀腐蚀滤波运算类似的函数?谢谢