当前位置:   article > 正文

基于PCL库函数的点云高斯滤波去噪方法_点云图像高斯滤波去噪公式

点云图像高斯滤波去噪公式

最近投稿点云数据处理的文章,经常被审稿人Diss不加点云去噪的相关介绍。点云去噪本身就是一个非常独立且复杂的研究领域,要想增加这部分内容的介绍,还是要下一点功夫的。这里,就跟大家分享一个基于PCL库的比较成熟的点云去噪方法实现,即高斯滤波

高斯滤波(标准差去噪)

去噪结果:

点云数据去噪前(左),去噪后,sigma = 6(右)。

Mesh数据去噪前(左),去噪后(右)。

适用于呈正态分布的数据。考虑到离群点的特征,则可以定义某处点云小于某个密度,既点云无效。计算每个点到其最近的k个点平均距离。则点云中所有点的距离应构成高斯分布。给定均值与方差,可剔除3∑之外的点。

高斯函数的具体介绍转自:https://blog.csdn.net/jorg_zhao/article/details/52687448

这里有几个对高斯核函数进行参数设置的方法,单独列出来以方便学习:

setSigma()

设置高斯函数的方差。随着sigma的增大,整个高斯函数的尖峰逐渐减小,整体也变的更加平缓,则对图像的平滑效果越来越明显。

setThreshold()

设置高斯函数的作用域半径threshold,超过则不计入计算。

 setThresholdRelativeToSigma()

依据核函数方差获得关联作用域,sigma_coefficient^2 * sigma^2 = threshold。

实例代码如下:

  1. //radius代表点云扫面的半径,这里需要用户计算获得
  2. #include <iostream>
  3. #include <pcl/io/pcd_io.h>
  4. #include <pcl/point_types.h>
  5. #include <pcl/point_cloud.h>
  6. #include <boost/random.hpp>
  7. #include <pcl/console/time.h>
  8. #include <pcl/filters/convolution_3d.h>
  9. #include <pcl/kdtree/kdtree_flann.h>
  10. using namespace std;
  11. vector<vector<double>> DenoisingPD_GaussianKernel(vector<vector<double>> pointCloudOriginal,double radius) {
  12. cout << "Gaussian denoising start:" << endl;
  13. pcl::PointCloud<pcl::PointXYZ>::Ptr inputcloud(new pcl::PointCloud<pcl::PointXYZ>);
  14. pcl::PointCloud<pcl::PointXYZ>::Ptr outputcloud(new pcl::PointCloud<pcl::PointXYZ>);
  15. //Read point cloud in the input file
  16. for (int i = 0; i < pointCloudOriginal.size(); i++)
  17. {
  18. pcl::PointXYZ cloud_i;
  19. cloud_i.x = pointCloudOriginal[i][0];
  20. cloud_i.y = pointCloudOriginal[i][1];
  21. cloud_i.z = pointCloudOriginal[i][2];
  22. inputcloud->push_back(cloud_i);
  23. }
  24. //Set up the Gaussian Kernel
  25. pcl::filters::GaussianKernel<pcl::PointXYZ, pcl::PointXYZ>::Ptr kernel(new pcl::filters::GaussianKernel<pcl::PointXYZ, pcl::PointXYZ>);
  26. (*kernel).setSigma(4);
  27. (*kernel).setThresholdRelativeToSigma(4);
  28. std::cout << "Kernel made" << std::endl;
  29. //Set up the KDTree
  30. pcl::search::KdTree<pcl::PointXYZ>::Ptr kdtree(new pcl::search::KdTree<pcl::PointXYZ>);
  31. (*kdtree).setInputCloud(inputcloud);
  32. std::cout << "KdTree made" << std::endl;
  33. //Set up the Convolution Filter
  34. pcl::filters::Convolution3D <pcl::PointXYZ, pcl::PointXYZ, pcl::filters::GaussianKernel<pcl::PointXYZ, pcl::PointXYZ> > convolution;
  35. convolution.setKernel(*kernel);
  36. convolution.setInputCloud(inputcloud);
  37. convolution.setSearchMethod(kdtree);
  38. convolution.setRadiusSearch(radius);
  39. convolution.setNumberOfThreads(10);//important! Set Thread number for openMP
  40. std::cout << "Convolution Start" << std::endl;
  41. convolution.convolve(*outputcloud);
  42. std::cout << "Convoluted" << std::endl;
  43. vector<vector<double>> pCDenosing(pointCloudOriginal.size());
  44. for (int i = 0; i < outputcloud->size(); i++) {
  45. vector<double> pi(3);
  46. pi[0] = outputcloud->at(i).x;
  47. pi[1] = outputcloud->at(i).y;
  48. pi[2] = outputcloud->at(i).z;
  49. pCDenosing[i] = pi;
  50. }
  51. cout << "Gaussian denoising finished!" << endl;
  52. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/236876
推荐阅读
相关标签
  

闽ICP备14008679号