1 为什么点云会有噪声?

受到仪器、周围环境、被扫描目标本身的特性影响,点云数据中无法避免存在一些噪声。噪声的来源有很多,比如超过扫描设定范围的点;由于受到周围的风、周围物体的震动等影响产生的点;或者是空气中水汽的影响等等,产生的噪声点,不仅会增加点云的数据量,还会影响建模、信息提取的精度等。需要进行去除。


2 噪声的类型

①漂移点,即那些明显远离目标主体,漂浮于点云上方的稀疏、散乱的点。

②孤立点,即那些远离点云中心区,小而密集的点。

③冗余点,即那些超过预定扫描区域的多余的点。

④混杂点,即那些和正确点混淆在一起的点。

————————《海量点云数据处理理论与技术》


3 matlab案列

(1)中值滤波

中值滤波采用各数据点的统计中值,对于消除数据毛刺,效果较好,但对于彼此靠近的混杂点噪声滤除效果不好。

(2)均值滤波

是对点集进行均布平均,将采样点的坐标值取为滤波窗口内各数据点的统计平均值,从而取代原有的点。均值滤波改变了点的位置,对高斯噪声有较好的平滑能力,但是容易造成边缘失真。

(3)高斯滤波

将某一数据点与其前后各n个数据点加权平均,那些远大于操作距离的点被处理成固定的端点,这有助于识别间隙和端点。由于高斯滤波平均效果较小,在滤波的同时,能较好的保持数据原貌,因而常被使用。

可以在matlab中使用函数smoothdata实现上述的三种去噪处理,这三种方法并非去除噪声点,而是平滑数据,这意味着数量是不会改变的。 

% 生成一个带有噪声的点云

clear all

% 生成平面点云数据
gv = 0:0.01:1;
[X,Y] = meshgrid(gv,gv);

% X(:)的意思是把矩阵转换为一行
p = [X(:),Y(:),0.5*ones(numel(X),1)];

% 生成噪声,随机生成500个噪声点
noise = rand(500, 3);

% 合并,p的矩阵为n*3
p = [p;noise];

pcshow(p)
%接下一段代码

% 通过中值滤波实现平滑处理
% 针对x坐标平滑
p1 = smoothdata(p(:,1),'movmean');
% 针对y坐标平滑
p2 = smoothdata(p(:,2),'movmean');
% 针对z坐标平滑
p3 = smoothdata(p(:,3),'movmean');
% pp为平滑后的xyz组合
pp = [p1,p2,p3];
pcshow(pp)

 

  可以发现,所有的噪声点都聚集在右边了,目标点也变得密疏不一。

关于smoothdata ,可以实现多种平滑数据操作,包含平均值、中值、高斯滤波、S-G滤波等等。其更加具体的方法,详见matlab帮助文档(对含噪数据进行平滑处理 - MATLAB smoothdata- MathWorks 中国)。

(4)基于空间分布的去噪算法(Statistical Outlier Removal,SOR)

基本原理:对每个点进行K领域统计分析,计算该点到它的K个邻近点的平均距离。假设所得结果服从高斯分布,高斯分布的形状取决于平均值和标准差,将平均距离在给定阈值范围之外的点并去除。———————————《激光雷达森林生态应用——理论、方法及实例》

该方法需要两个参数,一个是sig标准差的倍数参数,另一个是k邻近点的个数。

①计算每个点的k个邻近点的距离(d),计算这些距离的总和D。

②所有点的D相加,即sum(D)。

③计算距离总和的平均值mean(sum(D))。

④计算距离总和的标准差std(sum(D))。

⑤得到噪点离群距离mean(sum(D))+sig*std(sum(D))

⑥大于这个距离的就是噪声点。

MATLAB2019b自带SOR去噪function,使用如下:默认参数sig=1,k=4。

clear all
%生成平面点云数据
gv = 0:0.01:1;
[X,Y] = meshgrid(gv,gv);
% X(:)的意思是把矩阵转换为一行
p = [X(:),Y(:),0.5*ones(numel(X),1)];
% 生成噪声
noise = rand(500, 3);
% 合并
p = [p;noise];
pcshow(p)

% 将n*3的矩阵转换为matlab的格式
p = pointCloud(p);
% matlab2019b自带SOR去噪功能
p_non_nosie = pcdenoise(p);

pcshow(p_non_nosie)

 除此之外还有双边滤波、直通滤波、随机采样一致性滤波等。

如果没有安装matlab2019b的,可以尝试下载博主自己写的SOR函数,和matlab2019b自带的函数效果一致。资源链接:

matlab-点云SOR去噪算法,包含主程序和function-其它文档类资源-CSDN下载

主程序如下:SOR即为博主自己写的函数

clear all
%生成平面点云数据
gv = 0:0.01:1;
[X,Y] = meshgrid(gv,gv);
% X(:)的意思是把矩阵转换为一行
p = [X(:),Y(:),0.5*ones(numel(X),1)];
% 生成噪声
noise = rand(500, 3);
% 合并
p = [p;noise];
% pcshow(p)

% SOR 滤波,sig为1,k邻近为4
% a输出为去噪的数据
% idx为噪声点的索引,和去噪数据一样长,噪声点为0,非噪声为1
[idx, a] = SOR(p,1,4);
subplot(1,2,1),pcshow(p,idx)
subplot(1,2,2),pcshow(a)

(5)双边滤波

点云双边滤波处理,博客链接如下:

点云去噪-双边滤波-matlab实现-2021-7-26-_~追风筝的猫的博客-CSDN博客

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐