故事背景和目的:在進行機載LiDAR數據處理的時候,需要將激光雷達採集的點雲數據進行分類,分離出地面點雲以及地物點雲。基於地面點雲,再經過一定的處理,可生成DEM(數字高程模型),通過DEM能詳細掌握區域內的地形地貌,是目前測繪領域廣泛採用的方法。生成DEM的關鍵是有從原始點雲中分類產生的地面點,分類結果對後面的處理至關重要。本文主要介紹基於改進的形態學濾波器方法,分離地面點和地物點的方法。該算法主要思想來自《A Progressive Morphological Filter for Removing Nonground Measurements From Airborne LIDAR Data》論文,這是2003年發表的一篇比較經典的論文,刊登在 IEEE TRANSACTIONS ON GEOSCIENCE AND REMOTE SENSING,這是遙感領域級別比較高的雜誌,這篇論文的引用率也非常高,在很多後來的論文中都有提到。
算法的主要思想是基於數學形態學方法,採用開運算(先腐蝕,再膨脹)對點雲進行處理,使用漸進的濾波窗口,逐漸對地面點和地物點進行分離。在PCL中,剛好有基於該方法的算法實現,具體請參見【pcl::ProgressiveMorphologicalFilter類】。但是 在PCL中的代碼實現好像和原文中的算法不太一樣,在此處主要給出該算法涉及到的關鍵步驟。
算法描述:利用改進的形態學濾波器對激光點雲進行分類,分離出地面點和地物點。
輸入:pointClouds 原始點雲
cellSize 格網大小
Max windows size 最大濾波窗口
slope 坡度
輸出:groundPoints 地面點雲 ,objectPOints 地物點雲
算法步驟:
(1)找到原始點雲中的 min(x), min(y), max(x), max(y).
(2)計算 m=floor[(max(y)-min(y))/cellSize]+1
n=floor[(max(x)-min(x))/cellSize]+1
(3)構造二維數組A[m, n],將原始點雲存入該數組。對任意一點p(x, y, z),M=(y-min(y))/cellSize,N=(x-min(x))/cellSize。如果有多個點落入數組同一個元素中,取其中高程值即z最小的點。
(4)對數組A進行插值,填補其中沒有元素的位置,可採用最近鄰插值方法。新建B[m, n],並將A賦值給B。新建flag[m][n]二維數組,並初始化爲0。
(5)根據初始窗口b和最大窗口計算一系列濾波窗口。計算方法有以下兩種:
Wk=2kb+1 或者
Wk=2×pow(b, k)+1
通常,第二種方法能得到更少的濾波窗口,從而進行更少的迭代。
(6)設dhT=dh0;
(7)for each windows size wk
for i=1 to m
Pi=A[i; ]//取A[m][n]中的第i行存入Pi中
Z=Pi
Zf=erosion(Z, wk);//腐蝕處理
Zf=delation(Zf,wk);//膨脹處理
Pi=Zf;
A[i; ]=Pi;
for j=1 to n
if(Z[j]=Zf[j]>dhT) then flag[i][j]=wk;
if(dhT<dhmax)
dhT=dhmax;
else dhT=s(wk-w(k-1))C+dh0;
(8)for i=1 to m
for j=1 to n
if(B[i][j].x>0 and B[i][j].y>0)
if(flag[i][j]=0)
B[i][j] is a ground point
else
B[i][j] is a nonground point
腐蝕和膨脹:
(1)腐蝕Erosion
Erosion(Z, wk):
for j=1 to n
Zf[j]=min(Z[l]), where j-wk/2<l<j+wk/2
return Zf
(2)膨脹Dilation
Dilation(Z, wk):
for j=1 to n
Zf[j]=max(Z[l]), where j-wk/2<l<j+wk/2
return Zf
原文鏈接:https://blog.csdn.net/huang1004943336/article/details/51868204