Matlab实现点云抽稀-2021-11-6

1-什么是点云抽稀?

激光雷达扫描单站数据,并将很多的扫描站数据拼接在一起后,造成数据量过大、数据信息冗余,产生数据难以处理、提取信息收到干扰等等问题,需要按照一定的规则,对过量的点云数据进行点云的筛选,使得它在保留较多的信息的同时,减少数据量。

2-体素抽稀matlab2019b实现教程

博主以平均体素抽稀为例,按照一定的大小(m),将点云划分为大量的体素,提取每个体素的平均值代替每个体素包含的点云,即为平均体素抽稀,当然,这里也可以改成随机、或者其他规则。

最终实现点云的抽稀。

% 体素化
% 保留idx
% 根据体素格网进行降采样
% compressed是抽稀后的点云
% cellsize是体素的尺寸单位是m

% 读取点云
% teapot为matlab2019b自带的点云数据
a =  pcread('teapot.ply');
a = a.Location;
cellsize = 0.1;

%得到点云的最大最小值
minx = min(a(:,1));
miny = min(a(:,2));
minz = min(a(:,3));
maxx = max(a(:,1));
maxy = max(a(:,2));
maxz = max(a(:,3));

%顺序标记
bj = 1:length(a);
bj = bj';

%把点云按照体素进行格网划分
W = floor((maxx - minx) / cellsize) + 1;
H = floor((maxy - miny) / cellsize) + 1;
D = floor((maxz - minz) / cellsize) + 1;
voxel = cell(W,H,D);

for i=1:length(a)
    I = floor((a(i,1)-minx)/cellsize)+1;
    J = floor((a(i,2)-miny)/cellsize)+1;
    K = floor((a(i,3)-minz)/cellsize)+1;
    voxel{I,J,K} = [voxel{I,J,K};bj(i,:)];
end

%循环格网
compressed = [];
idx = [];
for i=1:W
    for j=1:H
        for k=1:D
            if isempty(voxel{i,j,k}) == 0
                idx1 = voxel{i,j,k};
                val = mean(a(idx1,:),1);
                compressed = [compressed;val];
            end
        end
    end
end

subplot(1,2,1),pcshow(a)
subplot(1,2,2),pcshow(compressed)

3-最终结果

左图为原始数据,右图为抽稀后的数据。 

后续博主会上传该function文件。

  • 5
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值