点云去噪(中值、高斯、均值、SOR滤波),及matlab的代码撰写-2021-7-21-

本文详细探讨了点云噪声的来源及其类型,如漂移点、孤立点等,并通过Matlab实例展示了中值滤波、均值滤波、高斯滤波以及空间分布的StatisticalOutlierRemoval(SOR)去噪方法。重点介绍了MATLAB中的smoothdata和自定义SOR函数在处理噪声点云上的应用。此外,双边滤波和非MATLAB解决方案也被提及。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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博客

### 不同类型的点云方法及其MATLAB实现 #### 中值滤波(Median Filter) 中值滤波是一种非线性滤波技术,能够有效地除脉冲声而不模糊边缘。对于点云数据而言,可以通过计算局部邻域内的中值来替代中心点的位置。 ```matlab function P_out = medianFilterPointCloud(P_in, k) % P_in 输入点云矩阵 N*3 % k 邻近点的数量 tree = KDTreeSearcher(P_in); [~, idx] = knnsearch(tree, P_in, 'K', k); P_out = zeros(size(P_in)); for i = 1:size(P_in, 1) neighbors = P_in(idx(i,:), :); P_out(i,:) = median(neighbors); end end ``` [^1] #### 高斯滤波(Gaussian Filter) 高斯滤波通过加权平均的方式处理数据,其中权重由距离决定,越靠近的点影响越大。这种方法适用于减少图像中的高频成分如椒盐声等。 ```matlab function P_filtered = gaussianFilterPointCloud(P, sigma) % P 是输入点云数组 n×3 % sigma 控制高斯核的标准差大小 dists = pdist2(P, P); weights = exp(-0.5 * (dists ./ sigma).^2); sum_weights = sum(weights, 2); P_filtered = bsxfun(@rdivide, P' * weights, sum_weights)'; end ``` [^2] #### 均值滤波(Mean Filter) 均值滤波是最简单的空间域平滑化操作之一,它通过对每一个像素位置上的灰度值求其领域内所有像素灰度值得算术平均作为该像素的新值达到消除孤立声的目的。 ```matlab function filteredCloud = meanFilter(cloudPoints, neighborhoodSize) % cloudPoints - 输入点云数据 [N x 3] % neighborhoodSize - 定义邻居范围半径 numPts = size(cloudPoints, 1); filteredCloud = zeros(numPts, 3); for ptIdx = 1:numPts distances = sqrt(sum((cloudPoints - repmat(cloudPoints(ptIdx,:),numPts,1)).^2, 2)); neighborIndices = find(distances <= neighborhoodSize); if ~isempty(neighborIndices) avgPos = mean(cloudPoints(neighborIndices,:)); %#ok<MEANM> filteredCloud(ptIdx,:) = avgPos; else filteredCloud(ptIdx,:) = cloudPoints(ptIdx,:); end end end ``` [^3] #### 统计离群点移除(SOR Filtering) 统计离群点移除(Statistical Outlier Removal, SOR)是基于统计学原理的一种过滤方式,通常用来检测并删除那些偏离整体趋势较远的数据点。 ```matlab function clean_cloud = sor_filtering(points, mean_k, thresh) % points: Nx3 matrix of point coordinates. % mean_k: Number of nearest neighbors to analyze for each point. % thresh: Standard deviation threshold. KDT = KDTreeSearcher(points); D = rangesearch(KDT, points, Inf, 'k', mean_k+1); all_dists = cellfun(@(x)x(:,1), D, 'UniformOutput', false); all_mean_dist = arrayfun(@(i)mean(all_dists{i}(2:end)), 1:length(D)); std_dev = std(all_mean_dist); global_mean = mean(all_mean_dist); is_inlier = abs(all_mean_dist-global_mean)<thresh*std_dev; clean_cloud = points(is_inlier,:); end ``` [^4] 这些算法各有优缺点,在实际应用时可以根据具体需求选择合适的方案。值得注意的是,上述代码片段仅提供了一种可能的实现途径,并未考虑边界条件和其他特殊情况;因此,在正式部署前还需要进一步测试和完善。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值