✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。
🍎个人主页:Matlab科研工作室
🍊个人信条:格物致知。
更多Matlab仿真内容点击👇
⛄ 内容介绍
针对点云数据量大的特点,提出了基于非均匀网格的点云数据缩减算法.采用球面投影的方法建立规则网格,以网格内部点的法矢的标准差作为网格细分的依据,用中值滤波的方法确定每个网格内的保留点,通过实验验证了该算法的可行性,并取得了良好的效果.
⛄ 部分代码
%%均匀网格法
clc
clear
close all
P = ascread('bun000.asc');
P = P{2};
figure;
x=P(1,1:1:end);
y=P(2,1:1:end);
z=P(3,1:1:end);
c=z+1;
scatter3(x,y,z,1.2,c,'filled');
colorbar
view(2)
title('原始数据')
X = P(1,:);
Y = P(2,:);
Z = P(3,:);
step=0.002;% 包围盒尺寸,控制精简率的唯一参数
% std_th = 100;
tic;
Xmin=min(X);Xmax=max(X);
Ymin=min(Y);Ymax=max(Y);
Zmin=min(Z);Zmax=max(Z);
jingjian = zeros(size(P));% 预定义
ite = 0;
for ix=Xmin:step:Xmax
xindex=find((X>=ix&X<(ix+step)));
if isempty(xindex)==1
continue
end
Xselect=X(xindex);
Yselect=Y(xindex);
Zselect=Z(xindex);
for iy=Ymin:step:Ymax
yindex=find(Yselect>=iy&Yselect<(iy+step));
if isempty(yindex)==1
continue
end
Xslt=Xselect(yindex);
Yslt=Yselect(yindex);
Zslt=Zselect(yindex);
for iz=Zmin:step:Zmax
zindex=find(Zslt>=iz&Zslt<(iz+step));
if isempty(zindex)==1
continue
end
Xsel=Xslt(zindex);
Ysel=Yslt(zindex);
Zsel=Zslt(zindex);
if length(zindex)==1
ite = ite + 1;
jingjian(:,ite) = [Xsel;Ysel;Zsel];
continue
end
Distance=sqrt((Xsel-mean(Xsel)).^2+(Ysel-mean(Ysel)).^2+(Zsel-mean(Zsel)).^2);
index=find(Distance==min(Distance));
index = index(1);
ite = ite + 1;
jingjian(:,ite) = [Xsel(index);Ysel(index);Zsel(index)];
end
end
end
jingjian(:,ite+1:end) = [];% 删除矩阵jingjian中的空位置
figure;
x=jingjian(1,:);
y=jingjian(2,:);
z=jingjian(3,:);
c=z+1;
scatter3(x,y,z,1.2,c,'filled');
colorbar
view(2)
title('精简后的点云');
toc;
disp(['精简率为:',num2str((size(P,2)-size(jingjian,2))/size(P,2)*100),'%']);
⛄ 运行结果
⛄ 参考文献
[1] 曹玉宝. 关于自由曲面数据点云直接数控加工的研究[D]. 江南大学.
[2] 陈慧群, 黎景炎. 基于变形网格法的高密点云曲面重建[J]. 工程图学学报, 2011, 32(2):4.
[3] 朱红迟金亮刘虹张坤. 基于AVP的不均匀散乱点云离群点去噪算法[J]. 计算机工程与设计, 2016, 037(005):1234-1238.
[4] 陈胜勇, 杨延红, 钱李勇,等. 基于均匀网格局部聚焦的点云法向量重定向方法和装置:, CN103593874B[P]. 2016.