Py学习  »  机器学习算法

大盘点!三维点云去噪算法,涉及深度学习等

计算机视觉工坊 • 9 月前 • 129 次点击  

作者:PCIPG-晨艺 | 来源:3DCV, 投稿入口

添加微信:cv3d007,备注:三维点云,拉你入群。文末附行业细分群。

1 什么是去噪

1.1 噪声

噪声:也称为孤立点/离群点/异常点,是指点云数据中的不相关或不希望存在的干扰信号或误差。噪声来源:环境光线的明亮程度、测量设备精度及系统误差、物体材料及表面的纹理和人为抖动等因素影响。

1.2 噪声来源

环境光线的明亮程度、测量设备精度及系统误差、物体材料及表面的纹理和人为抖动等因素。

1.3 点云去噪

在点云数据中,通过适当的滤波和处理方法,去除无用或噪声点,以提高数据质量和准确性的过程。

2 常见的去噪算法

2.1 统计滤波

1 原理

去除明显分布稀疏的离群点。根据给定均值与方差,可剔除方差之外的点,即方差之外的点是正确点。

2 举例

一点云中有50个点,每个点的邻近点个数设置为8,则50个点(8领域)的平均值计算如下:则算出50个点的平均值,设置距离阈值σ,若平均值在阈值之外的视为离群点,在点云数据中去除。

3 核心代码

—--统计滤波
//创建滤波器。对每个点分析的临近点的个数设置为50,并将标准差的倍数设置为1,这意味着如果一个点的距
离超出了平均距离一个标准差以上,则该点被标记为离群点,并将它移除,存储起来
pcl::Statistical0utlierRemowalSor;
sor. setInputCloud (cloud);//设置待波波的点云
sor.setMeamK (50);         //设置在进行统计时考虑查询点邻近点数
Sor. setStddevMu1Thresh(1); //设置判断是否为高群点的阈值,里边的数字表示标准差的倍数,1个标准差以上就是离群点。
//即。当判断点的k近邻平均距高(mean distance)大于全局的1倍标准差+平均距离(global distances meanm and standard),则为离群点。

2.2 直通滤波

1 原理

根据点云的属性(属性比如x,y,z,颜色值等),在点的属性上设置范围,对点进行滤波,保留范围内的或保留范围外的,则去除离群点。

2 举例

在一个点云数据中,取z轴0~1范围内的点云进行保存。

3 核心代码

//创建滤波器对象
pcl::PassThrough<:pointxyz> pass;
pass.setInputCloud (c1oud);
pass.setFi1terFie1dName ("z");//滤波字段名被设置为z轴方向
pass.setFi1terLimits (0.0,1.0);//设置在过滤方向上的过滤范围
// pass.setKeepOrganized(true);//保持有序点云结构,该功能用于有序点云才有意义。
pass.setNegative (true);//设置保留范围内的点还是过滤掉范围内的点,标志为false时保留范围内的点

2.3 半径滤波

1 原理

设定滤波半径,计算每个点在其半径范围内的其他点的个数。半径范围内其他点个数少于某一设定的阈值的点将被滤除。

2 举例设置半径为d,分别考察黄蓝绿三点,若点个数的阈值为1,则黄色点将被滤除;若阈值为2,则黄色点和绿色点都将被滤除。3 核心代码

ror.setInputC1oud(c1oud_in);     //输入点云
ror.setRadiusSearch(0.1);        //设置半径为0.1m范围内找临近点
ror.setMinNeighborsInRadius(10); // 设置查询点的邻域点集数小于10删除
ror.fi1ter(*cloud_radius);       //执行滤波

2.4 条件滤波

1 原理

根据点云数据的某些属性或特征进行筛选,可以一次删除满足对输入的点云设定的一个或多个条件指标的所有的数据点,如点的法线方向、点的强度值、点的颜色等属性来筛选点云数据。

条件滤波和直通滤波的区别:

条件滤波基于点的任何属性或特征进行筛选,而直通滤波只能基于轴向范围进行筛选。

2.5 中值滤波

1 原理

是常用的非线性滤波方法,用于去除图像或信号中的噪声。它通过将像素值替换为其邻域窗口内的中值来实现去噪的效果。

2 步骤

  • 定义一个固定大小的邻域窗口,通常是一个正方形或矩形窗口。
  • 将窗口内的像素值按照从小到大的顺序进行排序。
  • 取排序后的像素值的中间值作为中心像素的新值,用于替换原始像素值。
  • 对图像中的每个像素都应用上述步骤,以完成中值滤波。
  • 如下图3×3的内核(也可看做窗口,或者模版):
image.png

2.6 均值滤波

1 原理

是一种常用的线性滤波方法,通过计算邻域窗口内像素值的平均值来实现去噪的效果。但会破坏图像细节,使图像变得模糊。

2 举例

3×3的内核(也可看做窗口,或者模版)中,包含了9个点及对应像素值。在对该区域进行滤波过程为:对P1~P9九个像素的灰度值求平均,代替中间P5的灰度值。中值滤波和均值滤波的区别

  • 中值滤波能够更好地处理脉冲噪声或孤立的离群点,因为它选择中值作为替代值,而不受异常值的影响。
  • 中值滤波去除脉冲噪声或孤立的离群点,均值滤波能够平滑信号或图像。
  • 相比之下中值滤波运行速度更快

2.7 投影滤波

1 原理

将点投影到一个参数化模型上,这个参数化模型可以是平面、圆球、圆柱、锥形等进行投影滤波。

2 投影模型3 核心代码

//本例使用axtby+ez+d=O的平面模型创建一个系数为a=b=d=0,c=1的平面,也就是X-Y平面。z轴相关的点全部投影在X-Y面上
pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients());
coefficients->values.resize(4) ;
coefficients->values[0] = coefficients->values[1] = O;
coefficients->values[2] =1.0;
coefficients->values[3] =0;

2.8 高斯滤波

1 原理

用于平滑图像并减少图像中的噪声。基于高斯函数的数学原理,通过在图像上应用高斯核来实现平滑效果。

2 步骤

1)确定高斯核的大小和标准差:高斯核的大小是指核的尺寸,通常是一个奇数,例如3x3、5x5、7x7等。标准差决定了高斯函数的形状,控制了滤波的平滑程度。标准差越大,平滑效果越明显。

2)生成高斯核:根据确定的高斯核大小和标准差,生成一个二维的高斯权值矩阵。高斯权值矩阵中的每个元素表示了相应位置上的权重值,这些权重值是根据高斯函数计算得出的。


3)对图像进行卷积:将生成的高斯核应用于原始图像。对于图像中的每个像素,将高斯核与其周围的像素进行卷积操作。卷积操作即将高斯核的每个元素与对应位置的像素值相乘,并将结果进行求和。

4)更新像素值:将卷积操作得到的结果作为滤波后的像素值,用于更新原始图像中对应位置的像素值。这样就完成了一次高斯滤波操作。

5)对整个图像重复滤波操作:重复步骤3和步骤4,对整个图像进行滤波操作,直到所有像素都被更新为滤波后的值。

3 卷积原理

卷积操作中,高斯核与图像中的每个像素以及其周围的邻域像素进行加权求和。卷积的结果是通过将每个像素的值乘以对应位置的高斯核权重,并将所有结果相加得到的。假定中心点的坐标是(0,0),那么取距离它最近的8个点坐标,为了计算,需要设定σ的值。假定σ=1.5,则模糊半径为1的高斯模板如下:这个时候我们我们还要确保这九个点加起来为1(高斯模板的特性),这9个点的权重总和等于0.4787147,因此上面9个值还要分别除以0.4787147,得到最终的高斯模板。假设现有9个像素点,灰度值(0-255)的高斯滤波计算如下:通常创建KD树,可以用于加速搜索滤波器的卷积操作。

4 KD-Tree

依次搜寻每个点云数据周围的k个邻域点,并计算出采样点到其k个邻域点的平均欧式距离。原始点云数据经过KD-Tree 搜索后的数据集为,定义di为已经得到的点pi到其k个邻域点的平均距离,σ为di的标准差。

  • σ值越大,权值分布越平缓。因此邻域各点值对输出值的影响越大,最终结果造成图像越模糊;
  • 核大小固定,σ值越小,权值分布越突起。因此邻域各点值对输出值的影响越小,图像变化越小。假如中心点权值为1,其他点权值为0,最终结果是图像没有任何变化;
  • σ固定时,核越大图像越模糊;
  • σ固定时,核越小图像变化越小。

5 核心代码

//—————基于高斯核函数的卷积滤波实现-—---------
pcl::filters::CaussianKernel<:pointxyz> kernel;//滤波器类 输入+输出
kernel.setSigma(4);//高斯函数的标准方差,决定函数的宽度
kernel.setThresho1dRelativeToSigma(4)://设置相对Sigma参数的距离阈值
kernel.setThreshold(0.05);//设置距离阈值,若点间距高大于阈值则不予考虑
court <<"Kernel made”<
//——————-创建k维树——————
pcl::search::KdTree<:pointxyz>::Ptr tree(new pcl::search:KdTree<:pointxyz>);
tree->setInputCloud (cloud);
court <
//-———-—-设置三维卷积相关参数-——————————————
pc1:.filters::Convolution3D<:pointxyz>> convolution;
convolution.setKernel (kernel);//设置卷积核
convolution.setInputCloud (cloud);
convolution.setNumberOfThreads(8);//卷积操作的线程数量为8
convolution.setSearchMethod(tree);//搜索方法为tree
convolution.setRadiusSearch(0.01);//积操作的半径搜索参数为0.01
cout " <

3 深度学习的去噪算法

1)自编码器(Autoencoder):自编码器是一种无监督学习的神经网络模型,可以用于图像和信号的去噪。它通过将输入信号压缩到低维编码空间,然后再将其解码回原始信号空间,从而学习到信号的有用特征,并去除噪声。 

2)基于卷积神经网络(CNN)的去噪算法:CNN在图像处理领域广泛应用,可以用于图像去噪。通过在网络中使用卷积层、池化层和反卷积层等结构,CNN可以学习到图像的局部特征,并对噪声进行去除。 

3)基于生成对抗网络(GAN)的去噪算法:GAN是一种由生成器和判别器组成的对抗性模型。在图像去噪中,生成器负责将噪声图像转换为清晰图像,而判别器则用于判断生成器输出的图像是否真实。通过不断迭代训练,生成器可以生成更加清晰的图像,从而实现去噪效果。 

4)基于变分自编码器(VAE)的去噪算法:VAE是一种生成模型,可以学习到输入数据的潜在表示。在去噪中,VAE可以学习到噪声数据的潜在分布,并生成去噪后的图像或信号。

5)基于深度残差网络(DnCNN)的去噪算法:DnCNN是一种专门设计用于图像去噪的深度残差网络。它通过堆叠多个卷积层和残差连接来学习到图像中的噪声特征,并去除噪声。

4 参考

https://blog.csdn.net/qq_36686437/article/details/114160640

—END—

高效学习3D视觉三部曲

第一步 加入行业交流群,保持技术的先进性

目前工坊已经建立了3D视觉方向多个社群,包括SLAM、工业3D视觉、自动驾驶方向,细分群包括:[工业方向]三维点云、结构光、机械臂、缺陷检测、三维测量、TOF、相机标定、综合群;[SLAM方向]多传感器融合、ORB-SLAM、激光SLAM、机器人导航、RTK|GPS|UWB等传感器交流群、SLAM综合讨论群;[自动驾驶方向]深度估计、Transformer、毫米波|激光雷达|视觉摄像头传感器讨论群、多传感器标定、自动驾驶综合群等。[三维重建方向]NeRF、colmap、OpenMVS等。除了这些,还有求职、硬件选型、视觉产品落地等交流群。大家可以添加小助理微信: cv3d007,备注:加群+方向+学校|公司, 小助理会拉你入群。

添加小助理微信:cv3d007, 拉你入群

第二步 加入知识星球,问题及时得到解答

针对3D视觉领域的视频课程(三维重建、三维点云、结构光、手眼标定、相机标定、激光/视觉SLAM、自动驾驶等)、源码分享、知识点汇总、入门进阶学习路线、最新paper分享、疑问解答等进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业、项目对接为一体的铁杆粉丝聚集区,6000+星球成员为创造更好的AI世界共同进步,知识星球入口:「3D视觉从入门到精通」

学习3D视觉核心技术,扫描查看,3天内无条件退款
高质量教程资料、答疑解惑、助你高效解决问题

第三步 系统学习3D视觉,对模块知识体系,深刻理解并运行

如果大家对3D视觉某一个细分方向想系统学习[从理论、代码到实战],推荐3D视觉精品课程学习网址:www.3dcver.com

基础课程:

[1]面向三维视觉算法的C++重要模块精讲:从零基础入门到进阶

[2]如何学习相机模型与标定?(代码+实战)

[3]ROS2从入门到精通:理论与实战

工业3D视觉方向课程:

[1]机械臂抓取从入门到实战课程(理论+源码)

[2](第二期)从零搭建一套结构光3D重建系统[理论+源码+实践]

[3]三维点云处理:算法与实战汇总

[4]彻底搞懂基于Open3D的点云处理教程!

[5]3D视觉缺陷检测教程:理论与实战!

SLAM方向课程:

[1]深度剖析面向机器人领域的3D激光SLAM技术原理、代码与实战

[1]彻底剖析激光-视觉-IMU-GPS融合SLAM算法:理论推导、代码讲解和实战

[2](第二期)彻底搞懂基于LOAM框架的3D激光SLAM:源码剖析到算法优化

[3]彻底搞懂视觉-惯性SLAM:VINS-Fusion原理精讲与源码剖析

[4]彻底剖析室内、室外激光SLAM关键算法和实战(cartographer+LOAM+LIO-SAM)

[5](第二期)ORB-SLAM3理论讲解与代码精析

视觉三维重建

[1]彻底搞透视觉三维重建:原理剖析、代码讲解、及优化改进)

自动驾驶方向课程:

[1]面向自动驾驶领域目标检测中的视觉Transformer

[2]单目深度估计方法:算法梳理与代码实现

[3]面向自动驾驶领域的3D点云目标检测全栈学习路线!(单模态+多模态/数据+代码)

[4]如何将深度学习模型部署到实际工程中?(分类+检测+分割)

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/157364
 
129 次点击