PCL中形態學濾波

故事背景和目的:在進行機載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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章