我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

点云地面点滤波(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 点云地面点滤波内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

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

    目录1. 引言2. 基本思想3. CSF算法实现步骤3.1 “布料”模拟3.2 外部/内部因素驱动3.3 具体实现3.4 后处理4. 算法使用本篇博客参考Wuming Zhang的文章“An Easy-to-Use Airborne LiD
    2022-06-02

    python怎么实现CSF地面点滤波算法

    这篇文章主要讲解了“python怎么实现CSF地面点滤波算法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python怎么实现CSF地面点滤波算法”吧!目录一、算法原理二、读取las点云三、
    2023-06-20

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

    目录1. 引言2. Morphological Filters(形态学滤波) 2.1 膨胀/腐蚀2.2 形态学滤波3. Progressive Morphological Filters3.1 参数计算(窗口尺寸/高程差阈值)3.1.1 窗
    2022-06-02

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

    目录1.引言1.1什么是地面点滤波?1.2地面点滤波的相关方法2.PTD具体介绍2.1去除孤立点 2.2参数说明2.3选择种子点并构建TIN模型2.4迭代加密TIN模型本篇博客参考: 1)DEM generation from laser
    2022-06-02

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录