文章目录

  • 1 原理
  • 2 代码实现
  • 3 结果展示

1 原理

对每一点的邻域进行统计分析,基于点到所有邻近点的距离分布特征,过滤掉一些不满足要求的离群点。该算法对整个输入进行 两次迭代

在第一次迭代中,

  1. 对于点云中的每一个点,找到该点的K近邻;
  2. 计算每个点与它K近邻点的平局距离,结果满足高斯分布;
  3. 计算这些距离的均值 μ\muμ 和标准差 σ\sigmaσ;
  4. 设置距离阈值 dthreshold=μ±k⋅σd_{threshold}=\mu±k·\sigmadthreshold​=μ±k⋅σ,kkk 为标准差乘数;

在下一次迭代中,如果点的平均邻域距离在区间 [μ−k⋅σ,μ+k⋅σ][\mu-k·\sigma,\mu+k·\sigma][μ−k⋅σ,μ+k⋅σ] ,则该点为内点,予以保留,区间外的点为噪声点,予以删除。

2 代码实现

代码:

#include <pcl/io/pcd_io.h>
#include <pcl/filters/statistical_outlier_removal.h>
#include <pcl/visualization/pcl_visualizer.h>using namespace std;int main()
{//--------------------------------- 加载点云 ---------------------------------pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);           //待滤波点云if (pcl::io::loadPCDFile("test.pcd", *cloud) < 0){PCL_ERROR("\a点云文件不存在!\n");system("pause");return -1;}cout << "->加载点云中点的个数为:" << cloud->points.size() << endl;//============================================================================//--------------------------------- 统计滤波 ---------------------------------cout << "->正在进行统计滤波..." << endl;pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>); //滤波后点云pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor; //创建滤波器对象sor.setInputCloud(cloud);              //设置待滤波点云sor.setMeanK(10);                      //设置查询点的半径范围sor.setStddevMulThresh(3);              //设置判断是否为离群点的阈值,即半径内至少包括的点数//sor.setNegative(true);              //默认false,保存内点;true,保存滤掉的外点//sor.setKeepOrganized(true);           //是否保持点云的组织结构(针对结构点云)sor.filter(*cloud_filtered);         //执行滤波,保存滤波结果于cloud_filtered//去除 NaN 点(只针对结构点云。散乱点云不需要)//vector<int> Idx;//pcl::removeNaNFromPointCloud(*cloud_filtered, *cloud_filtered, Idx);//============================================================================//------------------------------- 保存滤波点云 --------------------------------cout << "->正在保存滤波点云..." << endl;if (!cloud_filtered->empty()){pcl::io::savePCDFileBinary("StatisticalOutlierRemoval.pcd", *cloud_filtered);cout << "->滤波后点云中的点数为" << cloud_filtered->points.size() << endl;}else{PCL_ERROR("\a滤波结果点云为空!\n");system("pause");return -1;}//============================================================================//-------------------------- 滤波前后对比可视化(选) ---------------------------pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("统计滤波前后对比"));///原始点云int v1(0);viewer->createViewPort(0.0, 0.0, 0.5, 1.0, v1); //设置第一个视口在X轴、Y轴的最小值、最大值,取值在0-1之间viewer->setBackgroundColor(0, 0, 0, v1); //设置背景颜色,0-1,默认黑色(0,0,0)viewer->addText("original_Pt", 10, 10, "v1_text", v1);viewer->addPointCloud<pcl::PointXYZ>(cloud, "original", v1);///半径滤波后点云int v2(0);viewer->createViewPort(0.5, 0.0, 1.0, 1.0, v2);viewer->setBackgroundColor(0.3, 0.3, 0.3, v2);viewer->addText("filtered_Pt", 10, 10, "v2_text", v2);viewer->addPointCloud<pcl::PointXYZ>(cloud_filtered, "filtered", v2);///设置相关属性viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "original", v1);viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 1, 0, 0, "original", v1);viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "filtered", v2);viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 0, 1, 0, "filtered", v2);while (!viewer->wasStopped()){viewer->spinOnce(100);boost::this_thread::sleep(boost::posix_time::microseconds(100000));}//============================================================================return 0;
}

输出结果:

->加载点云中点的个数为:41049
->正在进行统计滤波...
->正在保存滤波点云...
->滤波后点云中的点数为40329

3 结果展示


相关链接:

PCL点云数据处理基础❤️❤️❤️目录

PCL:StatisticalOutlierRemoval 统计滤波相关推荐

  1. PCL入门系列 —— StatisticalOutlierRemoval 点云统计滤波

    PCL入门系列 -- StatisticalOutlierRemoval 点云统计滤波 前言 程序说明 输出结果 代码示例 总结 前言 随着工业自动化.智能化的不断推进,机器视觉(2D/3D)在工业领 ...

  2. 点云库PCL学习笔记 -- 点云滤波Filtering -- 3. StatisticalOutlierRemoval 统计滤波器

    点云库PCL学习笔记 -- 点云滤波Filtering -- 3.StatisticalOutlierRemoval 统计滤波器 StatisticalOutlierRemoval 统计滤波器相关简介 ...

  3. [学习PCL]统计滤波(离群点剔除)

    1.原理介绍 StatisticalOutlierRemoval滤波器主要可以用来剔除离群点,或者测量误差导致的粗差点. 滤波思想为:对每一个点的邻域进行一个统计分析,计算它到所有临近点的平均距离.假 ...

  4. PCL之统计异常值去除滤波器--StatisticalOutlierRemoval

    作用:主要用于剔除离群点,或则测量误差导致的粗差点. 原理:对每一个点的邻域进行一个统计分析,计算它到所有临近点的平均距离.假设得到的结果是一个高斯分布,其形状是由均值和标准差决定,那么平均距离在标准 ...

  5. 利用统计滤波方法去除空中漂浮物 以及去噪

    //统计滤波 //#include "pch.h" //#include <iostream> //#include <pcl/io/pcd_io.h> / ...

  6. 图像处理之空域内的滤波复原[均值滤波、顺序统计滤波和自适应滤波复原]

    一.均值滤波 1.算术均值滤波器 算数均值滤波器即用周围灰度值的平均值代替滤波中心像素的灰度值,其表达式为: 其中m,n为滤波模板大小,f为需要处理的图像,g为滤波后的图像. 2.几何均值滤波器 几何 ...

  7. 3d激光雷达开发(基于统计滤波)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 基于统计方法的滤波其实是比较好理解的.也就是说,在一个局部范围内,选择距离最近的几十个点,要求他 ...

  8. matlab SOR统计滤波

    文章目录 一.原理概述 二.实现代码 三.实现效果 一.原理概述 将PCL中的SOR滤波也进行实现一下,方便后面使用,其原理是通过查询点与邻域点集之间的距离统计判断来进行过滤离群点.假设一个点的邻近点 ...

  9. PCL之直通滤波--PassThrough

    作用: 过滤掉指定字段上用户定义范围空间内的点集. 原理:首先,指定字段及该字段下的取值范围;其次,遍历点云中的每个点,删除取值不在值域内的点;最后,遍历结束,留下的点即构成滤波后的点云 效果: 简单 ...

最新文章

  1. R语言与数据分析(10)-内置数据集
  2. Web前端优化需要注意的点
  3. oauth password模式_SpringBoot OAuth2.0 认证授权(密码模式)
  4. 业务id转密文短链的一种实现思路
  5. Cocoa编程学习笔记一
  6. DotNET内存管理与垃圾回收[转]
  7. magic square java_测试Magic Square Java的.txt文件
  8. Linux写出相应密码的用途,linux运维面试题中级
  9. php网络学习,网络学习
  10. 【C++】set和multiset区别
  11. Iocomp ActiveX/VCL 2021 绿色版
  12. 使用python绘制一个太阳花代码_如何绘制多样化的太阳花?
  13. 时钟系统(NTP子母钟系统)如何为高铁系统保驾护航
  14. 什么是会员标签?会员标签有什么作用呢?
  15. [附源码]Python计算机毕业设计SSM绩效考核管理系统(程序+LW)
  16. 蓝奏云获取直API源码
  17. 打印机显示域服务器,操作打印机提示“active directory域服务当前不可用”怎么办?...
  18. 可以打勾的计划表app?标记完成计划试试这款便签
  19. 北美CS求学找工指南
  20. Win10无法拖动最大化窗口

热门文章

  1. 如何给表格中的关键字加中括号,双引号?
  2. 2018年关于人工智能、大数据和分析的十大预测
  3. github.io 公共博客
  4. libcurl 库的编译
  5. 关于seekbar的thumb被截取的问题
  6. 大学英语四线上考试翻译题
  7. 攻防世界web新手fileclude
  8. Verilog语法_1(reg、wire、always语法)
  9. JavaSE之常用API
  10. 红米note4x装linux,红米Note4X怎么装卡/插卡 红米Note4X手机SIM卡安装图文教程