航空激光雷达数据的地形分类
这个例子展示了如何在航空激光雷达数据中分割和分类地形,如地面、建筑和植被。该示例使用机载激光雷达系统捕获的LAZ文件作为输入。首先,将LAZ文件中的点云数据分为地面点和非地面点。然后,根据法线特征和曲率特征,进一步将非地面点分为建筑点和植被点。该图提供了该过程的概述。
加载和可视化数据
从LAZ文件中加载点云数据和相应的地面真相标签,aerialLidarData.laz
,从开放地形数据集获得[1].点云由不同的类别组成,包括地面、建筑和植被。方法将点云数据和相应的地面真值标签加载到工作区中readPointCloud
的对象函数lasFileReader
对象。可视化点云,根据地面真相标签进行颜色编码,使用pcshow
函数。
lazfile = fullfile (toolboxdir (激光雷达的),“lidardata”,“拉斯维加斯”,“aerialLidarData.laz”);从文件中读取LAZ数据lazReader = lasFileReader (lazfile);读取点云和相应的地面真值标签[ptCloud, pointAttributes] = readPointCloud (lazReader,...“属性”,“分类”);grdTruthLabels = pointAttributes.Classification;可视化输入点云与相应的地面真值标签图pcshow (ptCloud.Location grdTruthLabels)标题(“具有地面真相的航空激光雷达数据”)
地面的分类
地面的分类是将输入点云分割为地面和非地面的预处理步骤。方法将从LAZ文件加载的数据分割为接地点和非接地点segmentGroundSMRF
函数。
[groundPtsIdx, nonGroundPtCloud groundPtCloud] = segmentGroundSMRF (ptCloud);分别用绿色和洋红色可视化接地点和非接地点图pcshowpair (nonGroundPtCloud groundPtCloud)标题(“地面和非地面点的分类”)
特征提取
方法从点云提取特征helperExtractFeatures
函数。所有的辅助函数都作为支持文件附加到这个示例中。辅助函数估计点云中每个点的法线值和曲率值。这些特征通过将每个点与其邻域点关联来提供其底层结构信息。
可以指定要考虑的邻居的数量。如果邻居数量过低,helper函数会对植被点进行过聚类。如果邻居数量过多,建筑和植被之间没有明确的边界,建筑点附近的植被点分类错误。
邻居= 10;(法线曲率,neighInds] = helperExtractFeatures (nonGroundPtCloud,...邻居);
建筑物和植被分类
辅助函数使用法线和曲率的变化来区分建筑物和植被。与植被相比,建筑更加平面化,因此属于建筑的点的曲率变化和相邻点的法线相对差较小。植被点更加分散,这导致了与建筑相比曲率变化更大。的helperClassify
功能将非地面点分为建筑和植被。helper函数根据以下标准将点分类为构建:
每个点的曲率必须很小,在指定的曲率阈值内,
curveThresh
.相邻点的法线必须相似。相邻法线之间的余弦相似度必须大于指定的法线阈值,
normalThresh
.
不符合上述标准的点被标记为植被。helper函数将属于植被的点标记为1
和建筑2
.
%法向阈值和曲率阈值normalThresh = 0.85;curveThresh = 0.02;将点分为建筑和植被。neighInds标签= helperClassify(法线曲率,...normalThresh curveThresh);
从地面真相标签数据中提取建筑物和植被类别标签。由于LAZ文件有许多类,您必须首先隔离地面、建筑和植被类。分类标签符合ASPRS LAZ文件格式标准。
分类值2 -表示接地点
分类值3,4,5 -表示低、中、高植被点
分类值6 -代表建筑点数
定义maskData
从输入点云中提取属于地面、建筑物和植被的点。
maskData = grdTruthLabels>=2 & grdTruthLabels<=6;
修改输入点云的ground truth标签,指定为grdTruthLabels
.
将低、中、高植被压缩为单个值grdTruthLabels(grdTruthLabels>=3 & grdTruthLabels<=5) = 4;更新grdTruthLabels以进行度量计算grdTruthLabels(grdTruthLabels == 2) = 1;grdTruthLabels(grdTruthLabels == 4) = 2;grdTruthLabels(grdTruthLabels == 6) = 3;
将从以前的分类步骤中获得的预测标签存储在其中estimatedLabels
.
estimatedLabels = 0 (ptCloud.Count, 1);estimatedLabels (groundPtsIdx) = 1;estimatedLabels(labels == 1) = 2;estimatedLabels(labels == 2) = 3;
提取属于地面、建筑物和植被的标签。
grdTruthLabels = grdTruthLabels (maskData);estimatedLabels = estimatedLabels (maskData);
用地面真相和估计的标签可视化地形。
ptCloud =选择(ptCloud maskData);hFig =图(“位置”,[0 0 900 400]);axMap1 =次要情节(1、2、1,“颜色”,“黑”,“父”, hFig);axMap1。位置= [0 0.2 0.5 0.55];pcshow (ptCloud。位置、grdTruthLabels“父”axMap1)轴从标题(axMap1,“带有地面真实标签的航空激光雷达数据”axMap2 = subplot(1,2,2,)“颜色”,“黑”,“父”, hFig);axMap2。位置= (0.5,0.2,0.5,0.55);pcshow (ptCloud。位置、estimatedLabels“父”axMap2)轴从标题(axMap2,“带有分类标签的航空激光雷达数据”)
验证
通过计算给定点云上的总精度以及类精度、交叉过并(IoU)和加权IoU来验证分类。
confusionMatrix = segmentationConfusionMatrix (estimatedLabels、双(grdTruthLabels));舰导弹= evaluateSemanticSegmentation ({confusionMatrix},...{“地面”“植物”“建筑”},“详细”, 0);disp (ssm.DataSetMetrics)
GlobalAccuracy MeanAccuracy MeanIoU WeightedIoU ______________ ____________ _______ ___________ 0.99769 0.99608 0.98233 0.99547
disp (ssm.ClassMetrics)
精度欠条________ _______地面0.99995 0.99995植被0.99079 0.99008建筑物0.99751 0.95696
另请参阅
功能
readPointCloud
|segmentGroundSMRF
|pcnormals
|pcshow
|pcshowpair
|segmentationConfusionMatrix
|evaluateSemanticSegmentation
对象
参考文献
[1]斯塔尔,斯科特。塔斯卡卢萨,美国:季节性洪水动态和无脊椎动物群落。国家机载激光测绘中心,2011年12月1日。OpenTopography (https://doi.org/10.5069/G9SF2T3K)