从点云数据中识别地面信息,提取地面点的过程,称为地面点滤波,是生成数字高程模型(Digital elevation model,DEM)的重要前提。
现有的地面点滤波算法有很多,大部分滤波算法在场景相对简单的区域有较好的效果,但是在一些较为复杂的区域,效果就会变差,现有的算法还缺少较强的普适性。
本文在这里以matlab为例,寻找已写好的滤波算法,实现地面点滤波。
布料滤波(CSF)
布料滤波已广受人们知晓,这里不在做过多的介绍,详细其他博主。
其资源可在以下网址免费下载:github
https://github.com/jianboqi/CSF
首先加载示例数据,以做显示:pcshow函数
clear
% 读取示列数据
a = pcread('sample.ply');
% 提取xyz值
a = a.Location;
% 显示点云
pcshow(a)
然后使用CSF滤波实现地面点识别
% 使用CSF滤波函数滤波
[g,ng] = csf_filtering(a,1,true,0.5,0.5,500,0.65);
% 制作地面点标记
col = zeros(length(a),1);
% 为地面点标记为1
col(g,:) =1;
% 显示地面点和非地面点
pcshow(a(:,1:3),col)
下图中黄色的高亮点即为地面点
简单形态学滤波(SMRF)
简单形态学滤波,其具体原理不再做介绍,方法及资源如下方链接免费下载:github
https://github.com/thomaspingel/smrf-matlab
加载示例数据并设置参数
clear
a = pcread('sample.ply');
pcshow(a)
a = a.Location;
% 参数设置
c = 3;
s = .2;
w = 16;
et = .45;
es = 2.0;
% gest中标识了地面点
[ZI R gest] = smrf(a(:,1),a(:,2),a(:,3),'c',c,'s',s,'w',w,'et',et,'es',es);
% o是地面点,1是非地面点
idx = gest==0;
col = zeros(length(a),1);
col(idx,:) = 1;
pcshow(a,col);
经验模态分解(EMD)
经验模态分解滤波,其具体原理不再做介绍,方法及资源如下方链接免费下载:github
https://github.com/himmetozcan/EMD_Lidar
clear
a = pcread('sample.ply');
pcshow(a)
a = a.Location;
par.cellSize = 1;
par.outlierThr = 5;
par.iterationNum = 10;
par.maxW = 20/par.cellSize;
par.maxThr = 4;
par.te = 0.6;
par.slopeThr = true;
% Pobjects储存了地面点标记
[Gdsm, Gdtm, Pdtm, Pobjects] = filterlidar_emd(a(:,1:3), par);
imshow( Gdtm)
idx = Pobjects==0;
classground = zeros(length(a(:,1)),1);
%地面点标记为1
classground(idx,:) = 1;
pcshow(a(:,1:3),classground)
其他滤波方法
1 在免费软件中,点云魔方PCM中可以实现形态学滤波、坡度滤波、移动曲面滤波、三角网滤波、CSF滤波
2 Lidar360可以实现改进的渐进三角网滤波
3 Globar mapper 可以实现形态学滤波