点云地面点滤波(Cloth Simulation Filter, CSF)
作者:wxc_1998 发布时间:2023-08-12 17:01:31
本篇博客参考Wuming Zhang的文章“An Easy-to-Use Airborne LiDAR Data Filtering Method Based on Cloth Simulation”
不方便的小伙伴可以在此:资源链接下载。
1. 引言
机载LiDAR可以获取快速、低成本地获取大区域的高精度地形测量值。为了获取高精度的地形数据(厘米级),对机载LiDAR点云数据进行“滤波”是一个非常重要的步骤。因此近二十年来,国内外学者提出了众多有效的自动滤波算法,大大降低了人力成本,提高了点云数据的应用效率。在博客:“点云地面点滤波(Progressive Morphological Filter)算法介绍(PCL库)”与“点云地面点滤波-progressive TIN densification(PTD)算法介绍”中分别对两种常用滤波器进行了介绍。
以往的众多算法滤波效果容易受到地形特征的影响(通常在复杂场景及陡峭地形区域滤波效果较差)且常常需要用户对数据有较为丰富的先验知识来进行设置滤波器中的各种参数。
为了解决这些问题,张吴明教授等人在2015年第三届全国激光雷达大会提出的“布料”滤波算法,本篇博客对其进行了简要介绍。
2. 基本思想
传统的滤波算法大多是考虑在坡度、高程变化之间的不同来进行区分地物点与地面点,而布料”滤波算法从一个完全新的思路来进行滤波,首先把点云进行翻转,然后假设有一块布料受到重力从上方落下,则最终落下的布料就可以代表当前地形。如下图所示,可以帮助我们进行理解。
下方的蓝色图形代表原始测量值,对其进行翻转,红色虚线代表布料,可以反映地形的起伏。
3. CSF算法实现步骤
3.1 “布料”模拟
首先,定义了一个基本公式:
式中,X代表“布料”中的粒子在 t 时刻的位置,Fext(X,t)代表外部驱动因素(重力,碰撞等),Fint(X,t)代表内部驱动因素(粒子间的内部联系)。
即可以总结为“布料”粒子的位置受到Fext(X,t)与Fint(X,t)两方面因素的影响。
随后如下图所示,通过四个状态对“布料”粒子的移动过程进行说明。
(a)为初始状态,假设一个虚拟的布放在翻转的LiDAR测量值上方。黑色点为LiDAR测量值,深红色点为可移动粒子。
(b)计算重力影响下对粒子产生的位移,由此一些粒子可能会出现在地面的下方。浅红色点为粒子的旧位置。
(c)相交检查,检查粒子新位置是否到达地面,如果已经到达地面则设置为不可移动。蓝色点代表粒子不可移动
(d)考虑“布料”的内部驱动,对现有的“可移动”粒子,根据邻近粒子所产生的“力”来进行移动新的位置。(如上图小房子处的可移动粒子)
3.2 外部/内部因素驱动
如3.1节中所述,粒子的位置移动包括外部/内部两方面的驱动因素,首先假设只有外部因素Fext(X,t),并设置内部因素Fint(X,t)为0,可以得到以下公式:
式中,m为粒子的重量,通常设置为1,△t 为时间步长。且由于G是一个常数,所以上式非常容易计算,只要给定一个△t 就可以计算出下一次迭代粒子所在的新位置。
为了约束粒子在反转表面空白区域的反转问题,作者又考虑了使用内部因素Fint(X,t) 。任意选取两个相邻的粒子,如果两个粒子都是 可移动 的,则令二者往相反的方向移动同样的距离;如果一个是不可移动的,则移动另一个;如果两者具有相同的高度,则不进行移动。
位移量可以通过下式进行计算:
式中,d为粒子的位移量;当粒子可移动时,b等于1,不可移动时b等于0;pi为p0的相邻粒子,n是把点进行标准化到垂直方向上的单位向量(0,0,1)T。
移动过程如下图所示:
同时还引入了一个新的参数rigidness, RI,用来描述粒子的移动次数,RI为1时,则移动一次,且移动的距离是两个粒子之间高差的1/2;RI为2时,则移动两次,且移动3/4。类似的,RI为3时,移动三次,移动距离为两个粒子高差的7/8。RI的值越大,则“布料”就越硬,一般来说,平地需要设置RI的值较大,陡坡、山区需要设置的RI值较小。
3.3 具体实现
综上所述,布料模拟的简要步骤可以总结如下:
1)通过第三方软件去除原始LiDAR点云数据中的“孤立点”。
2)反转LiDAR点云。
3)初始布料格网,这时用户需要设置格网的大小(grid resolution, GR)。初始“布料”的位置通常在最高点的上方。
4)把所有LiDAR点与格网粒子投影到同一个水平面,并找到每一个粒子的最近邻点(corresponding point, cp),记录其投影前的高程(intersection height value, IHV)
5)对于每一个可移动的格网“粒子”,计算其受到重力影响产生的位移,并与当前粒子对应cp点的IHV进行比较,如果粒子的高度低于或者等于IHV,则把粒子的高度设置为IHV并设置为不可移动点。
6)对于每个格网“粒子”,计算其受到内部驱动因素影响所产生的的位移。
7)重复上述5)、6)步骤,直到所有粒子的最大高承诺变化足够小或者迭代次数到达用户的预先设置值,则停止模拟过程。
8)计算LiDAR点云与格网粒子之间的高度差异。
9)区分地面点与非地面点,如果LiDAR点与模拟粒子之间的距离小于预先设置的阈值hcc,则认为其是地面点,反之则认为其为非地面点。
3.4 后处理
上述方法处理过后对于平坦区域可以取得较好的效果,但是对于“陡坡”区域仍然会产生较大的误差,因为“布料”会由于其粒子间的内部约束而落在地面测量值的上方。如下图所示:
为了消除这些误差,可以通过一个后处理方法来解决。在每一个“可移动”粒子的四个邻接点中找到“不可移动”粒子,然后比较“最近邻点”之间的高程差,如果高程差值小于阈值hcp,则把“可移动”粒子移动到地面,并设置为不可移动。
例如,上图中的D点,找到了一个不可移动的粒子A,然后比较C,B之间的高程差值(对于D点、A点之间的最近邻点CP)。如果高程差值小于阈值hcp则待判断点D就被移动到C点,且被设置为不可移动。重复上述操作,直到所有的“可移动”粒子被正确处理。
如果逐行扫描“粒子”来进行实现此后处理操作,结果可能会受到特定扫描方向的影响。因此,作者采用了先建立一个“强连接元素集”(strongly connected components, SCC)包含一个关联的可移动粒子集。
如上图所示,每个SCC中包括两种粒子,第一种是至少包含一个近邻“不可移动”粒子(上图中的黄色点M1),第二种是近邻点中不包含“不可移动”粒子(上图中的红色点M2)。执行过程中使用外部的黄色点为“初始种子点”,通过“广度优先”的方式逐步向内遍历SCC。如上图中的从1-18点,实现了从边缘逐步向内部靠近处理过程,而不受扫描方向的影响。
4. 算法使用
Cloth Simulation Filter已经在各种点云处理软件,以及MATLAB中都可以直接进行使用,对用户操作友好,非常方便。
各种使用方式的超链接如下:
MATLAB中mex插件
cloud compare 中CSF滤波
dll与lib下载
以及源码都在github上开源了
来源:https://blog.csdn.net/wxc_1998/article/details/107206075
猜你喜欢
- SQL SERVER 2012中新增了CHOOSE,该函数可以从值列表返回指定索引处的项。例如:select CHOOSE(3,'A
- 一、前言预处理建议仔细看完本文章之后在进行操作,避免失误,本环境可以用于生产环境,有利于生产环境python之间的环境隔离,互相不会产生环境
- 一、问题描述给定两个字符串,求解这两个字符串的最长公共子序列(Longest Common Sequence)。比如字符串1:BDCABA;
- 目前用于Python的格式化程序(如autopep8和pep8ify)都用于删除代码中的lint错误。这有很明显的局限性。YAPF采用了不同
- 开发的时候我都是使用XDebug在本地调试,但是最近加入一些项目中去,环境太复杂了,要在本地搭建一个开发环境真的太麻烦了,那么我们怎么使用x
- Vue3新属性:CSS 中的 v-bind()写在前面:本文主要介绍Vue3中的新增的v-bind()的常用使用方式,主要包括在css,le
- 1、其中再语义分割比较常用的上采样:其实现方法为:def upconv2x2(in_channels, out_channels, mode
- tornado 里面没有 session?不,当然有~我知道 github 上肯定有人帮我写好了~ O(∩_∩)O~
- 在编程过程中,我们常常需要用到字符串与其它类型的转换,strconv包可以帮我们实现此功能。1.string -> int使用方法:f
- 本文实例为大家分享了js实现计算器功能的具体代码,供大家参考,具体内容如下在老师的带领下完成了这个简单的计算器,这是一个神奇的过程,计算器的
- 关于电子邮件 大学之前,基本不用邮箱,所以基本感觉不到它的存在,也不知道有什么用;然而大学之后,随着认识的人越来越多,知识越来越广
- uni-app简介uni-app是一个使用Vue.js开发跨平台应用的前端框架,开发者编写一套代码,可编译到iOS、Android、H5、小
- 1. 介绍BoltBoltDB是纯Go语言实现的持久化解决方案,保存数据至内存映射文件。称之为持久化解决方案不是数据库,因为数据库这个词有很
- 前言在最初搭建公司监控系统的时候,最头疼的是需要把同类项目组的相同图形添加到一个Screens,由于只能一个一个的添加,非常耗时耗经历。下面
- 作为开发者,我们可以通过以下3中方式来配置logging:1)使用Python代码显式的创建loggers, handlers和format
- 一、效果展示话不多说先上效果为了更有意境我加了个完美的背景来衬托出月饼的好看我的月饼画的不圆的原因是我故意的,为什么呢?因为月有阴晴圆缺啊!
- Python将控制台输出另存为日志文件需求  在 PyCharm 中或者说运行 python 程序时会使
- 本文实例讲述了Python面向对象之继承和多态用法。分享给大家供大家参考,具体如下:Python 类的继承和多态Python 类的继承在OO
- tags faker 随机 虚拟faker文档链接代码程序:# -*- coding=utf-8 -*-import sysfrom fak
- 等了好久的小程序,终于在近日曝光了。现在就带大家来尝尝鲜。以下是一张随便看看的图。一、构建微信小程序的步骤下载开发工具考虑到微信0.9.09