当前位置:   article > 正文

PCL中形态学滤波_pcl点云膨胀

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/267970
推荐阅读
相关标签
  

闽ICP备14008679号