点云地面点滤波(Cloth Simulation Filter, CSF)

目录
  • 1. 引言
  • 2. 基本思想
  • 3. CSF算法实现步骤
    • 3.1 “布料”模拟
    • 3.2 外部/内部因素驱动
    • 3.3 具体实现
    • 3.4 后处理
  • 4. 算法使用

本篇博客参考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上开源了

到此这篇关于点云地面点滤波(Cloth Simulation Filter, CSF)"布料"滤波算法详解的文章就介绍到这了,更多相关python 点云地面点滤波内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python实现CSF地面点滤波算法原理解析

    目录 一.算法原理 二.读取las点云 三.算法源码 四.结果展示 五.CloudCompare实现 一.算法原理 布料模拟滤波处理流程: 1)利用点云滤波算法或者点云处理软件滤除异常点: 2)将激光雷达点云倒置: 3)设置模拟布料,设置布料网格分辨率 G R GR GR,确定模拟粒子数.布料的位置设置在点云最高点以上: 4)将布料模拟点和雷达点投影到水平面,为每个布料模拟点找到最相邻的激光点的高度值,将高度值设置为 I H V IHV IHV: 5)布料例子设置为可移动,布料粒子首先受到重力作

  • 点云地面点滤波(Cloth Simulation Filter, CSF)"布料"滤波算法详解

    目录 1. 引言 2. 基本思想 3. CSF算法实现步骤 3.1 "布料"模拟 3.3 具体实现 3.4 后处理 4. 算法使用 本篇博客参考Wuming Zhang的文章"An Easy-to-Use Airborne LiDAR Data Filtering Method Based on Cloth Simulation" 不方便的小伙伴可以在此:资源链接下载. 1. 引言 机载LiDAR可以获取快速.低成本地获取大区域的高精度地形测量值.为了获取高精度的地

  • 点云地面点滤波(Cloth Simulation Filter, CSF)

    目录 1. 引言 2. 基本思想 3. CSF算法实现步骤 3.1 "布料"模拟 3.2 外部/内部因素驱动 3.3 具体实现 3.4 后处理 4. 算法使用 本篇博客参考Wuming Zhang的文章"An Easy-to-Use Airborne LiDAR Data Filtering Method Based on Cloth Simulation" 不方便的小伙伴可以在此:资源链接下载. 1. 引言 机载LiDAR可以获取快速.低成本地获取大区域的高精度地

  • python点云地面点滤波(Progressive Morphological Filter)算法介绍(PCL库)

    目录 1. 引言 2. Morphological Filters(形态学滤波) 2.1 膨胀/腐蚀 2.2 形态学滤波 3. Progressive Morphological Filters 3.1 参数计算(窗口尺寸/高程差阈值) 3.1.1 窗口尺寸 3.1.2 高程差阈值 3.2 参数输入/输出 3.2.1 参数输入 3.2.1 参数输出 3.3 PCL官方示例代码 本篇博客参考Keqi Zhang的文章"A Progressive Morphological Filter for R

  • python 点云地面点滤波-progressive TIN densification(PTD)算法介绍

    本篇博客参考: 1)DEM generation from laser scanner data using adaptive TIN models 2)Filtering airborne LiDAR data by embedding smoothness-constrained segmentation in progressive TIN densification 文章名中有超链接,若不方便下载,则可以在此:资源链接进行下载. 1.引言 1.1什么是地面点滤波? 机载激光雷达(airb

  • 浅析bilateral filter双边滤波器的理解

    图像去噪的方法很多,如中值滤波,高斯滤波,维纳滤波等等.但这些降噪方法容易模糊图片的边缘细节,对于高频细节的保护效果并不明显.相比较而言,bilateral filter双边滤波器可以很好的边缘保护,即可以在去噪的同时,保护图像的边缘特性.双边滤波(Bilateral filter)是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的(不理解这几个概念没关系,后面会慢慢解释). 1. 双边滤波(Bilateral filte

  • Python OpenCV图像处理之图像滤波特效详解

    目录 1分类 2邻域滤波 2.1线性滤波 2.2非线性滤波 3频域滤波 3.1低通滤波 3.2高通滤波 1 分类 图像滤波按图像域可分为两种类型: 邻域滤波(Spatial Domain Filter),其本质是数字窗口上的数学运算.一般用于图像平滑.图像锐化.特征提取(如纹理测量.边缘检测)等,邻域滤波使用邻域算子——利用给定像素周围像素值以决定此像素最终输出的一种算子 频域滤波(Frequency Domain Filter),其本质是对像素频率的修改.一般用于降噪.重采样.图像压缩等. 按

  • C++ opencv将图片动漫化介绍

    目录 边缘检测 贴边缘图到原图 双边滤波 HSI空间修改饱和度 后续: 总结 最近对图像处理十分感兴趣,也学着用opencv 实现各种简单的图像处理,因此,有了下面的实验,就是将照片处理成漫画的风格. 对照片进行动漫话一般需要四个步骤1.边缘检测2.将边缘检测得到的边缘 以黑色的形式贴在原来的画上.3.对贴了边缘的图进行双边滤波,双边滤波可以较好的滤波的同时保留边缘.4.修改图像的颜色的饱和度,本文采用的是将RGB转化为HSI空间,然后调整S分量. 边缘检测 对于边缘检测,本文采用的是canny

  • 用JavaScript玩转游戏物理(一)运动学模拟与粒子系统

    系列简介 也许,三百年前的艾萨克·牛顿爵士(Sir Issac Newton, 1643-1727)并没幻想过,物理学广泛地应用在今天许多游戏.动画中.为什么在这些应用中要使用物理学?笔者认为,自我们出生以来,一直感受着物理世界的规律,意识到物体在这世界是如何"正常移动",例如射球时球为抛物线(自旋的球可能会做成弧线球) .石子系在一根线的末端会以固定频率摆动等等.要让游戏或动画中的物体有真实感,其移动方式就要符合我们对"正常移动"的预期. 今天的游戏动画应用了多种

  • Python图像处理PIL各模块详细介绍(推荐)

    Image模块 Image模块是在Python PIL图像处理中常见的模块,对图像进行基础操作的功能基本都包含于此模块内.如open.save.conver.show-等功能. open类 Image.open(file) ⇒ image Image.open(file, mode) ⇒ image 要从文件加载图像,使用 open() 函数, 在 Image 模块: @zhangziju from PIL import Image ##调用库 im = Image.open("E:\mywif

随机推荐