点云的滤波

激光扫描通常会产生密度不均匀的点云数据集。另外,测量中的误差会产生稀疏的离群点,使效果更糟。估计局部点云特征(例如采样点处法向量或曲率变化率)的运算很复杂,这会导致错误的数值,反过来有可能导致点云的配准等后期处理失败。

以下方法可以解决其中部分问题:对每个点的邻域进行一个统计分析,并修剪掉那些不符合一定标准的点。我们的稀疏离群点移除方法基于在输入数据中对点到临近点的距离分布的计算。对每个点,我们计算它到它的所有临近点的平均距离。假设得到的结果是一个高斯分布,其形状由均值和标准差决定,平均距离在标准范围(由全局距离平均值和方差定义)之外的点,可被定义为离群点并可从数据集中去除掉。

使用StatisticalOutlierRemoval滤波器移除离群点

图1展示了稀疏离群点分析和移除的效果:左图为原始数据集,右图为处理结果。该图展示了处理前和处理后,一个点邻域范围内的k近邻邻域平均距离。

图1 稀疏离群点分析和移除的效果对比图

代码

首先,在PCL(Point Cloud Learning)中国协助发行的书[1]提供光盘的第8章例3文件夹中,打开名为statistical_removal.cpp的代码文件,

同文件夹下可以找到相关的测试点云文件table_scene_lms400.pcd

下面来解析上面打开源代码的关键语句。下列代码将从磁盘中读取点云数据。

pcl::PCDReaderreader;//定义读取对象
reader.read<pcl::PointXYZ>("table_scene_lms400.pcd",*cloud);//读取点云文件

然后,创建了一个pcl::StatisticalOutlierRemoval滤波器,将对每个点分析的临近点个数设为50,并将标准差倍数设为1,这意味着如果一个点的距离超出平均距离一个标准差以上,则该点被标记为离群点,并将被移除。计算后的输出结果储存在cloud_filtered中。

pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;// 创建滤波器对象
sor.setInputCloud(cloud);                        //设置呆滤波的点云
sor.setMeanK(50);                                //设置在进行统计时考虑查询点邻近点数
sor.setStddevMulThresh(1.0);                    //设置判断是否为离群点的阈值
sor.filter(*cloud_filtered);                    //执行滤波处理保存内点到cloud_filtered

剩下的数据(内部点)将被存入磁盘,以供其他使用,例如可视化等。

pcl::PCDWriterwriter;
writer.write<pcl::PointXYZ>("table_scene_lms400_inliers.pcd",*cloud_filtered,false);

然后,使用同样的参数再次调用该滤波器,但是利用函数setNegative设置使输出取外点,以获取离群点数据(也就是原本滤除掉的点)。

sor.setNegative(true);
sor.filter(*cloud_filtered);

并将数据写回到磁盘。

writer.write<pcl::PointXYZ>("table_scene_lms400_outliers.pcd",*cloud_filtered,false);
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/statistical_outlier_removal.h>

int
main (int argc, char** argv)
{
  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered (new pcl::PointCloud<pcl::PointXYZ>);
  // 填入点云数据
  pcl::PCDReader reader;
  // 把路径改为自己存放文件的路径
  reader.read<pcl::PointXYZ> ("table_scene_lms400.pcd", *cloud);
  std::cerr << "Cloud before filtering: " << std::endl;
  std::cerr << *cloud << std::endl;
  // 创建滤波器对象
  pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;
  sor.setInputCloud (cloud);
  sor.setMeanK (50);
  sor.setStddevMulThresh (1.0);
  sor.filter (*cloud_filtered);
  std::cerr << "Cloud after filtering: " << std::endl;
  std::cerr << *cloud_filtered << std::endl;
  pcl::PCDWriter writer;
  writer.write<pcl::PointXYZ> ("table_scene_lms400_inliers.pcd", *cloud_filtered, false);
  sor.setNegative (true);
  sor.filter (*cloud_filtered);
  writer.write<pcl::PointXYZ> ("table_scene_lms400_outliers.pcd", *cloud_filtered, false);
  return (0);
}

  可以直接在VS中执行控制台会输出点云滤波的信息,并得到两个pcb分别存储内点和外点:

table_scene_lms400_inliers.pcd
table_scene_lms400_outliers.pcd
原点云可视化结果:

滤波处理后:    

 

参考:http://www.pclcn.org/study/shownews.php?lang=cn&id=68

时间: 12-06

点云的滤波的相关文章

点云滤波简介

点云滤波是点云处理的基本步骤,也是进行 high level 三维图像处理之前必须要进行的预处理.其作用类似于信号处理中的滤波,但实现手段却和信号处理不一样.我认为原因有以下几个方面: 点云不是函数,对于复杂三维外形其x,y,z之间并非以某种规律或某种数值关系定义.所以点云无法建立横纵坐标之间的联系. 点云在空间中是离散的.和图像,信号不一样,并不定义在某个区域上,无法以某种模板的形式对其进行滤波.换言之,点云没有图像与信号那么明显的定义域. 点云在空间中分布很广泛.历整个点云中的每个点,并建立

如何在ROS中使用PCL—数据格式(1)

在ROS中点云的数据类型 在ROS中表示点云的数据结构有: sensor_msgs::PointCloud      sensor_msgs::PointCloud2     pcl::PointCloud<T> 关于PCL在ros的数据的结构,具体的介绍可查 看            wiki.ros.org/pcl/Overview 关于sensor_msgs::PointCloud2   和  pcl::PointCloud<T>之间的转换使用pcl::fromROSMsg

PCL::pointcloudFiltering(1)

点云滤波的概念 点云滤波是点云处理的基本步骤,也是进行 high level 三维图像处理之前必须要进行的预处理.其作用类似于信号处理中的滤波,但实现手段却和信号处理不一样.我认为原因有以下几个方面: 点云不是函数,对于复杂三维外形其x,y,z之间并非以某种规律或某种数值关系定义.所以点云无法建立横纵坐标之间的联系. 点云在空间中是离散的.和图像,信号不一样,并不定义在某个区域上,无法以某种模板的形式对其进行滤波.换言之,点云没有图像与信号那么明显的定义域. 点云在空间中分布很广泛.历整个点云中

[PCL]点云渐进形态学滤波

PCL支持点云的形态学滤波,四种操作:侵蚀.膨胀.开(先侵蚀后膨胀).闭(先膨胀后侵蚀) 在#include <pcl/filters/morphological_filter.h>中定义了枚举类型 1 enum MorphologicalOperators 2 { 3 MORPH_OPEN, 4 MORPH_CLOSE, 5 MORPH_DILATE, 6 MORPH_ERODE 7 }; 具体实现: 1 template <typename PointT> void 2 pcl

遥感影像滤波处理软件 — timesat3.2

最近因为要做遥感影像的滤波处理,经过女神推荐,决定用Timesat,可是该软件3.1版本只适合xp系统以及2011的matlab,后来在官网上找到了最新的3.2版本.支持64位操作系统以及2014的matlab.大家可以直接上官网(http://www.nateko.lu.se/TIMESAT/timesat.asp )注册下载,但是有一个问题是,官网注册的时候,会用到Google公司的rechaptcha验证码系统,因为大天朝的墙太高了,所以是刷不出来的,可以选择挂vpnFQ下载.如果不想FQ

引导图滤波算法C语言实现

引导图滤波(导向图滤波, guided Filter)是一种图像滤波技术,能够根据引导图来生成不同的权重,对原图进行加权平均,实现滤波效果.在图像去雾,立体视觉等很多方面有广泛的应用. C语言实现放在我的码云上,链接在此:https://git.oschina.net/rxdj/guidedFilter.git. 输入:引导图像I,待滤波图像P,滤波半径r, 阈值eps:输出:滤波结果图. 引导图可以是单通道或者三通道,三通道必须是RGB格式:待滤波图像必须是单通道图像,数据类型为double:

点云处理软件开发进度

一.点云显示模块 根据PCL中国官方论坛上田博士的四篇文章http://www.pclcn.org/bbs/forum.php?mod=viewthread&tid=223&page=1&extra=#pid750,在MFC环境中搭建了基本的点云显示模块.这是后续所有操作的基础. 1.需要解决的问题有: ( 1)由于田博士在帖子里说,PCL-1.6.0-AllInOne-msvc2010-win32中提供的VTK5.8缺少关键文件vtkMFCWindow.h和vktMFC.lib,

点云数据处理学习笔记

三维计算视觉研究内容包括: 三维匹配 多视图三维重建 SLAM 目标识别 形状检测与分类 语义分类 立体视觉与立体匹配 ZNCC SFM 1.点云滤波方法(数据预处理): 双边滤波.高斯滤波.条件滤波.直通滤波.随机采样一致性滤波. VoxelGrid 2.关键点 ISS3D.Harris3D.NARF SIFT3D. 3.特征和特征描述 法线和曲率计算  NormalEstimation .特征值分析Eigen-Analysis.EGI PFH.FPFH.3D Shape Context.Sp

ROS机器人程序设计(原书第2版)补充资料 (陆) 第六章 点云 PCL

书中,大部分出现hydro的地方,直接替换为indigo或jade或kinetic,即可在对应版本中使用. RGBD深度摄像头传感器最常用的数据存储,处理和显示方式就是点云. 推荐查阅-PCL官网:http://www.pointclouds.org/ 1. http://wiki.ros.org/pcl_ros 2. http://wiki.ros.org/pcl 补充阅读: 1 http://blog.csdn.net/zhangrelay/article/details/50053733