以下列出方法均有运行成功的代码,所有工程文件我都会放在如下链接:

https://github.com/gx-sun/classic-point-cloud-denoising-methods

欢迎star

持续补充中,目前最新为2021.12月。

1.移动最小二乘MLS

基于PCL

#include "stdafx.h"#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/kdtree/kdtree_flann.h>
#include <pcl/surface/mls.h>
int main(int argc, char** argv)
{// 将一个适当类型的输入文件加载到对象PointCloud中pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>());// 加载bun0.pcd文件,加载的文件在 PCL的测试数据中是存在的 pcl::io::loadPCDFile("bunny_hi_noise.pcd", *cloud);// 创建一个KD树pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);// 输出文件中有PointNormal类型,用来存储移动最小二乘法算出的法线pcl::PointCloud<pcl::PointNormal> mls_points;// 定义对象 (第二种定义类型是为了存储法线, 即使用不到也需要定义出来)pcl::MovingLeastSquares<pcl::PointXYZ, pcl::PointNormal> mls;mls.setComputeNormals(true);//设置参数mls.setInputCloud(cloud);mls.setPolynomialFit(true);mls.setSearchMethod(tree);mls.setSearchRadius(0.06);// 曲面重建mls.process(mls_points);// 保存结果pcl::io::savePCDFile("bunny_hi_noise_mls.pcd", mls_points);
}

2.双边滤波

2.1基于PCL

实验编译成功了,但是因为其需要intensity分量,一般都没有,故无法运行

#include "stdafx.h"
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/kdtree/kdtree_flann.h>
#include <pcl/filters/bilateral.h>typedef pcl::PointXYZI PointT;int
main(int argc, char *argv[])
{std::string incloudfile = "block_noise.pcd";std::string outcloudfile = "block_bf.pcd";float sigma_s = 0.1;float sigma_r = 0.2;// Load cloudpcl::PointCloud<PointT>::Ptr cloud(new pcl::PointCloud<PointT>);pcl::io::loadPCDFile(incloudfile.c_str(), *cloud);pcl::PointCloud<PointT> outcloud;// Set up KDTree//pcl::KdTreeFLANN<PointT>::Ptr tree(new pcl::KdTreeFLANN<PointT>);pcl::search::KdTree<PointT>::Ptr tree1(new pcl::search::KdTree<PointT>);pcl::BilateralFilter<PointT> bf;bf.setInputCloud(cloud);bf.setSearchMethod(tree1);bf.setHalfSize(sigma_s);bf.setStdDev(sigma_r);bf.filter(outcloud);// Save filtered outputpcl::io::savePCDFile(outcloudfile.c_str(), outcloud);return (0);
}

2.2 基于CGAL

官方example代码,无需强度分类,只需点位置和法线信息,运行成功版本:

#include <CGAL/Simple_cartesian.h>
#include <CGAL/property_map.h>
#include <CGAL/IO/read_xyz_points.h>
#include <CGAL/IO/write_xyz_points.h>
#include <CGAL/bilateral_smooth_point_set.h>
#include <CGAL/tags.h>#include <utility> // defines std::pair
#include <fstream>// Types
typedef CGAL::Simple_cartesian<double> Kernel;
typedef Kernel::Point_3 Point;
typedef Kernel::Vector_3 Vector;// Point with normal vector stored in a std::pair.
typedef std::pair<Point, Vector> PointVectorPair;// Concurrency
typedef CGAL::Parallel_if_available_tag Concurrency_tag;int main(int argc, char*argv[])
{const char* input_filename =  (argc>1)?argv[1]:"data/fin90_with_PCA_normals.xyz";const char* output_filename = (argc>2)?argv[2]:"data/fin90_with_PCA_normals_bilateral_smoothed.xyz";// Reads a .xyz point set file in points[] * with normals *.std::vector<PointVectorPair> points;std::ifstream stream(input_filename);if (!stream ||!CGAL::read_xyz_points(stream,std::back_inserter(points),CGAL::parameters::point_map(CGAL::First_of_pair_property_map<PointVectorPair>()).normal_map(CGAL::Second_of_pair_property_map<PointVectorPair>()))){std::cerr << "Error: cannot read file " << input_filename << std::endl;return EXIT_FAILURE;}// Algorithm parametersint k = 120;                 // size of neighborhood. The bigger the smoother the result will be.// This value should bigger than 1.double sharpness_angle = 25; // control sharpness of the result.// The bigger the smoother the result will beint iter_number = 3;         // number of times the projection is appliedfor (int i = 0; i < iter_number; ++i){/* double error = */CGAL::bilateral_smooth_point_set <Concurrency_tag>(points,k,CGAL::parameters::point_map(CGAL::First_of_pair_property_map<PointVectorPair>()).normal_map(CGAL::Second_of_pair_property_map<PointVectorPair>()).sharpness_angle (sharpness_angle));}Save point set.std::ofstream out(output_filename);out.precision(17);if (!out ||!CGAL::write_xyz_points(out, points,CGAL::parameters::point_map(CGAL::First_of_pair_property_map<PointVectorPair>()).normal_map(CGAL::Second_of_pair_property_map<PointVectorPair>()))){return EXIT_FAILURE;}return EXIT_SUCCESS;
}

3.LOP

4.WLOP

基于CGAL:

安装CGAL可以参考:CGAL如何配置-小白向_Meet_csdn的博客-CSDN博客_cgal 配置

安装好后的工程文件是CGAL自带的,在文件夹example/Point_set_processing_3/wlop_simplify_and_regularize_point_set_example,运行结果如下:

原始模型

去噪下采样后模型

                       

参考代码:CGAL 5.3 - Point Set Processing: User Manual

文章:Huang H, Li D, Zhang H, et al. Consolidation of unorganized point clouds for surface reconstruction[J]. ACM transactions on graphics (TOG), 2009, 28(5): 1-7.

5.CLOP

官方实现,原始地址。

对应文章:"Reinhold Preiner, Oliver Mattausch, Murat Arikan, Renato Pajarola, Michael Wimmer
Continuous Projection for Fast L1 Reconstruction
ACM Transactions on Graphics (Proc. of ACM SIGGRAPH 2014), 33(4):47:1-47:13, August 2014."

下载下来后可以运行,速度还不错,会对点云下采样

5.EAR

官方代码,有exe版本和源码版本,exe可以双击运行。

参考地址:Edge-Aware Point Set Resampling | Visual Computing Research Center @ Shenzhen University

文章:Huang H, Wu S, Gong M, et al. Edge-aware point set resampling[J]. ACM transactions on graphics (TOG), 2013, 32(1): 1-12.

6.PCN(point-clean-net)

可以去除离群点和噪声点

地址:https://github.com/mrakotosaon/pointcleannet

7.TD(total denoising)

第一篇点云无监督去噪方法,结果偏向平滑。

地址:https://github.com/phermosilla/TotalDenoising

TotalDenoising代码复现步骤_Meet_csdn的博客-CSDN博客

8.Pointfilter

目前SOTA,效果比较好,编码解码结构,简单有效

地址:https://github.com/dongbo-BUAA-VR/Pointfilter

经典点云去噪算法总结相关推荐

  1. c语言算法竞赛入门经典百度云,《算法竞赛入门经典》CH-2(C语言)

    中国剩余定理,题目要求: 每组数据包含3个非负整数a,b,c,表示队尾人数(a<3, b<5, c<7),输出总人数的最小值(或报告无解).已知总人数不小于10,不超过100.输入到 ...

  2. 点云深度学习的经典理论与实用算法

    三维点云是最重要的三维数据表达方式之一,在三维重建.语义及实例分割.三维物体检测等方向表达相关信息.点云学习在计算机视觉.自动驾驶.机器人等领域得到越来越多的广泛应用. (三维点云的一些应用场景) 但 ...

  3. 详解4种经典的限流算法

    最近,我们的业务系统引入了Guava的RateLimiter限流组件,它是基于令牌桶算法实现的,而令牌桶是非常经典的限流算法.本文将跟大家一起学习几种经典的限流算法. 限流是什么? 维基百科的概念如下 ...

  4. 图像与点云三维重建算法

    图像与点云三维重建算法 单图像三维重建算法介绍 在开始讨论之前先说一下为什么要做单图像三维重建,原因其实很直观.总结起来就是两个字,"需要".我们很需要这类应用,如果可以做出来,不 ...

  5. 3D点云配准算法-4PCS(4点全等集配准算法)

    简介 4PCS算法是一种快速的.鲁棒的三维点云配准方案,该方案使用宽基底,对噪声和异常值具有良好的适应性,该算法允许对有噪声的原始数据进行配准,而无需对数据进行预过滤或去噪.此外,该方法大大减少了在噪 ...

  6. 点云综述一稿 点云硬件、点云软件、点云处理算法、点云应用以及点云的挑战与展望

    经过一周的综述撰写,深感点云算法应用之浩瀚,只能仰仗前辈们的文章作一些整理: 点云硬件: 点云获取技术可分为接触式扫描仪.激光雷达.结构光.三角测距(Triangulation).以及立体视觉等多种. ...

  7. 多视图点云配准算法综述

    作者:杨佳琪,张世坤,范世超等 转载自:华中科技大学学报(自然科学版) 编辑:东岸因为@一点人工一点智能 原文:​​多视图点云配准算法综述​​ 摘要:以多视图点云配准为研究对象,对近二十余年的多视图点 ...

  8. 点云去噪-双边滤波-matlab实现-2021-7-26-

    2021-7-21的时候博主已经写过部分点云去噪的介绍及部分滤波matlab写法,在新开的博客中补充博主在写双边滤波时的想法,21号的贴子链接: 2021-7-21-点云去噪(中值.高斯.均值.SOR ...

  9. 最经典最新的图像去噪算法

    图像去噪是非常基础也是非常必要的研究,去噪常常在更高级的图像处理之前进行,是图像处理的基础.可惜的是,目前去噪算法并没有很好的解决方案,实际应用中,更多的是在效果和运算复杂度之间求得一个平衡,再一次验 ...

最新文章

  1. 白盒测试实践-任务完成
  2. 云计算安全解决方案白皮书(一)
  3. TensorFlow Wide And Deep 模型详解与应用 TensorFlow Wide-And-Deep 阅读344 作者简介:汪剑,现在在出门问问负责推荐与个性化。曾在微软雅虎工作,
  4. 轻松一下——高考笑句
  5. Dynatrace成功扩展kubernetes全栈可观察性
  6. bootstrap inputfile.js
  7. SSH远程管理、参数讲解、xshell使用、scp,sftp,ssh命令(ssh两种方式的密钥验证方...
  8. C++基础学习9:构造函数和析构函数
  9. git version可以卸载吗_sourcetree使用:问题是有推送提示,但显示为空。原因:git版本过低...
  10. 论文阅读笔记——个体识别研究中的计算机辅助照片匹配:以塞伦盖蒂猎豹为例
  11. 魔方矩阵c语言,C语言检验并打印魔方矩阵,检验并打印魔方矩阵,用C语言,求大神尽快解决...
  12. 2020最新安卓版本是多少_努比亚Z20安卓P版本刷机包(官方最新固件rom下载V2.24正式版)...
  13. 关于Mysql8.0时区表问题解决
  14. 用Python制作好玩的小游戏
  15. AI实现语音文字处理,PaddleSpeech项目安装使用 | 机器学习
  16. 【转载】网站关闭了域名备案信息是否需要注销,答案是一定要记得注销域名备案信息,防止域名过期后被他人注册用于非法用途而带来不必要的麻烦...
  17. 提高工作效率--番茄工作法
  18. no matching host key type found. Their offer: ssh-rsa
  19. 技术解读|马云见证!蚂蚁金服推出全球首个区块链跨境汇款服务
  20. 「镁客·请讲」脑穿越黄庄:过分乐观和激情之后,行业需要找到VR不可替代之处...

热门文章

  1. WeX5 APP发布及版本升级注意事项
  2. ubuntu 安装nodebb
  3. 禁止网页 切屏 切换标签
  4. amigo幸运字符什么意思_OMG,12 个精致的 Java 字符串操作小技巧,学它
  5. 【零知识证明】数独解的例子解释零知识证明
  6. curl指定代理_如何使用cURL指定用户代理
  7. 红黑数和普通的二叉排序树有什么要求
  8. Android10.0 startService启动过程
  9. Win10 BIOS改AHCI蓝屏无法启动的 两个解决方法
  10. 可持续时尚分论坛精彩回顾 | 第二届始祖数字化可持续发展峰会