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

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

点云实验室lab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值