1. 前言:

在解离散测地线问题中,Fast Marching算法被广泛使用。其最大的优点是可以直接应用于点云数据。要知道,大部分内蕴几何算法需要原始数据提供连续的网格信息,才能够被使用。Fast Marching算法能够在没有网格信息的前提下,根据点云局部邻域的关系,利用波动方程计算点云内不同点的时间与距离的均匀变化,得到点云的标量距离场,其结果可以被近似的看作是测地距离计算结果。这对于点云数据几何特征分析具有十分重要的意义。

网上大部分关于Fast Marching算法的描述,都偏理论一些,涉及大量的数学概念。本文中,我们尽量简化那些复杂的概念,使读者能够用更快的速度上手Fast Marching算法的设计工作。本文的一些描述可能并不准确,很多都是基于我个人理解,不能作为严格意义上的教程,如果读者希望理解Fast Marching算法更加具体的细节,可阅读参考文献 [1] 。如果你对复杂的数学概念没有兴趣,只是希望尽快实现算法,可以跳过第二节。

2. 背景知识:

2.1 波动方程模型

Fast Marching算法由R.Kimmel和J.A. Sethian两位科学家在90年代提出。该算法在部分中文翻译中被译为快速推进算法,其过程是模仿波动方程的前向传导。关于波动方程,一个简单的理解就是类似水波在水面传递的过程。其数学模型可以表示为一个程函方程(Eikonal Equation)。程函方程还有另外两个名字,既短时距方程或几何光学方程,包含了程函方程模拟波动的物理实质。在测地线计算中,程函方程是一个带有边界条件的双曲型偏微分方程(Hyperbolic partial differential equation), 表示为:

||▽d|| = 1 and d(x0) = 0。 其中x0为波动源点,距离为0。距离随时间的变化匀速传导,即速度为1。也有文章 [2] 记作如下格式:

其中T为到达函数,即记录到达某一点(x,y)的时间,F为传播速度。取到达时间梯度的绝对值和速度的乘积为1,即沿梯度进行匀速运动。(这里加入梯度乘积,我的理解是,这种匀速运动是要考虑到到达函数本身的影响的)。总体来说,该过程可以被理解为一种泛匀速运动。存在两种波动形式:1. 基于边界值的模型;2. 基于初始值的模型

基于边界值的模型比较容易理解。举一个例子,在衣服上滴了一滴油,这滴油在接触衣服的一瞬间,会有一个极小的区域被油污染。这时,这个污染区域的边界可以被理解为波动方程的一个初始边界。随着时间的推移,这个边界会慢慢扩大,直到其污染了一个更大的区域。假设这滴油不会受限于实际的油量和物理约束,那么这滴油会污染整件衣服。油的边界是不断的在扩大的。这种情况就属于第一种情况。这种情况下,F是不等于0的。

相对于第一种情况,基于初始值的模型就稍微复杂一点。在更一般的波动问题中,没有定义边界,而是定义的更一般化的初始值进行传播,那么波动可能会发生回传,即一个位置波经过后,可能会再一次传播回来。这种情况就要通过使用水平集方法(level set function)来解决。波动界面(interface)在时间T的水平集为0,其他大于0或小于0。其数学模型可以表示为:

表示水平集函数,F为速度函数,表示水平集函数对时间的一阶导数。

基于初始值的模型允许波动界面以更一般的方式进行传导。在这样的一般化传导问题中,Fasr Marching算法就不能够使用了。这也是Level Set方法的由来。

波在传播过程中,不能保证在每一个点值的唯一性,如下图所示,即使在一个高阶连续的波动方程驱动下,奇异点也会很快产生。在参考文献 [2] 中对这种情况给了解释,有兴趣的可以看下,感觉和实现关系不大,这里不在赘述。Level Set方法在各个研究领域都有广泛的应用,学习其对于解波动方程初始值的基本思路,对于深入理解Level Set方法有极大的帮助。如果希望深入了解Level Set方法,一定要看下J.A. Sethian撰写的相关资料[4][5]。

2.2 汉密尔顿-雅可比方程

如果速度只依赖于空间位置与位置函数的一阶导数,那么两种波动方程模型能够转换为一般的汉密尔顿-雅可比方程。我的理解就是求解偏微分方程的方法。

H为汉密尔顿函数,Du为u的所有分量,x表示位置,α是0或1。假设α=0,  , 转化为程函方程

这里汉密尔顿-雅可比方程的作用,我的理解是基于当前的状态和更早前的状态,估计下一步波动的结果。

这里引入一个流函数Flux Functions G的概念。G用于求出双曲守恒定律的解:

已知两点位置u1和u2, 流函数的数值解可以表示为:

这里的意思应该是估计的值应该满足水平集一个值大于等于0和一个值小于等于0的原则来进行的。

有一个例子比较容易理解该过程。步骤n的标量我们是知道的,我们希望求下一步的标量,即n+1。

这里我们希望数据的更新符合流函数的更新规则,而更新结果能够基于当前结果进行数值逼近

能够被用来模拟:

如果更新符合守恒规则,那么更新应该符合非递减函数的性质。

流函数符合上述更新规则。对流函数进行建模,那么波动方程的数值模拟结果能够被计算出来(这里的描述非常像使用拉普拉斯算子在曲面上计算调和函数,当然这只是一个实例。关于水平集的叙述更一般化)。

2.3 求解

为了求解,首先给出一个凸函数速度算法

其中U表示汉密尔顿雅可比方程解,使用u代替U,u为双曲守恒律的一个解,方程被改写为:

这个函数形式与之前的双曲守恒形式一致,所以能够近似的表示为流函数

这样凸函数速度算法能够转换为:

一维情况:

二维情况:

对于水平集来说:

前向与后向传播的符号定义:

算法使用速度函数F, 微分算子以及时间不长,以产生下一步的值。高阶模式能够被建立以得到更准确的结果,但是这里不再讨论。

Fast Mearching算法基于上述推导,可由

转换为:

简写为:

该二次型用于求解下一时间的标量值,而与时间步长无关。

3. 算法实现:

Fast Marching算法用于求解边界值问题,基本的规则为

包含了一个收缩或扩张的“前端”。波动界面(interface)总是沿着网格中下一个最小的T值传播,直到传导到未知点。

转换为点云上求测地线的问题,其模型为。给定一个源点,按照匀速传播的原则,对点云其他点赋值。赋值等于源点到该点的距离。当传播完成后,一个距离标量场被建立。这符合Fast Marching算法对于求边界值波动方程的要求。

具体算法的实现是比较简单的,即:

1)初始化源点距离为0,其他顶带你距离为Inf:d(x0) = 0, d(xi)=无穷大

2)源点状态为Active, 其他顶点为Wait-Active

While(存在False顶点){

          查找状态为Active的点中距离值最小的点x,将其状态更新为Non-active

          将x相邻状态为Far的顶点状态更新为Active

          For 顶点x相邻状态为Active的顶点x‘

                 For 顶点x’的一环邻域三角片

                        使用程函方程计算顶点x'的距离值d,记录dmin

                 更新顶点x'的距离值:d(x') = min{d(x'), dmin}

}

Return d(x)

这里关于利用程函方程解距离值,就用到了之前使用流函数进行数值模拟的思路,Kimmel and Sethian 在1998年的相关工作 [3] 中给出了解法,即wave front。我们这里一个图来简洁的说明。

已知d1和d2的距离标量值以及三角形d1,d2和d3的边长,计算d3的距离标量值。根据wave front方法以及流函数的相关介绍,d3的标量值可以根据非常简单的几何计算得到。这种情况类似于平行的光术进行传播。该方法的缺点是受钝角三角形影响,产生违反单调波动规则。具体细节在工作 [3] 中有详细的介绍,可以通过三角抛分来解决。

一个应用更加广泛的方法是采用Spherical wavefront来进行点源传播,其结果更加精确。如果三角化足够好,其结果甚至可以作为精确解。实例如下图所示:

通过三角函数能够计算出相应的距离。我们在这里给出Fast Marching算法一个演示:(来自https://www.cnblogs.com/shushen/archive/2016/04/12/5381753.html)

4. 总结

Fast Marching算法模拟了边界值条件下的波动方程求解问题。通过流函数的模拟确定更新方法,并最终得到一个标量函数解。基于点云的测地线计算问题,能够非常好的适用于Fast Marching算法。通过计算点云的邻域关系,得到点云的距离场,并最终得到全局的测地距离。当然,该方法也存在缺点,就是受点云本身密度分布影响较大,没有考虑点云对应的MLS曲面的曲率变化。相比之下,Heat Flow方法对该问题提出了新的解决方法。在下一篇博客中,我们将介绍Heat Flow方法。

参考文献:

[1] J.A. Sethian. Fast Marching Methods and Level Set Methods for Propagating Interfaces.

[2] Jeff Dicker. Fast Marching Methods and Level Set Methods: An Implementation.

[3] Kimmel, Ron, and James A. Sethian. Computing geodesic paths on manifolds.

[4]  J.A. Sethian. Level set methods and fast marching methods: evolving interfaces in computational geometry, fluid mechanics, computer vision, and materials science.

[5] R Malladi, JA Sethian. Level set and fast marching methods in image processing and computer vision.

Fast Marching算法及其在点云测地线计算中的应用相关推荐

  1. 试编写一个将双向循环链表逆置的算法_循环双向链表在电路计算中的应用

    问题描述在电路分析中,通常以图论为数学工具,进行建模,求解.我们只研究二端元件,可以将电路中的每一个元件用一条边来表示,元件的端点用顶点来表示. 元件的端点和端点是可以连接在一起的,比如导线的端点连接 ...

  2. 阿里云流计算中维表join VS 流join

    最近业务上使用blink进行清洗数据,使用到了双流join和维表join,今天有同学问我流join和维表join有什么区别.在此我做个简单的说明,描述不对的地方,欢迎大家纠正,后面补充. 流式计算过程 ...

  3. Fast marching on 3D meshes with diffusion distance

    与fast marching on 3D meshes with euclidian distance 不同(http://blog.csdn.net/seamanj/article/details/ ...

  4. Fast Marching on 3D Meshes

    3D mesh的fast marching 跟2D图片的fast marching类似. 2D图片是规则的平面网格,点的ux,uyu_x, u_y是通过上或下,左或右(具体哪个,是通过距离小的点去确定 ...

  5. fast marching method 计算内波相速度

    在计算内孤立波传播轨迹的时候,可以应用(Jackson,2009)(J09)提出的经验公式 C(x,y)=Cmaxtanh[B1+H(x,y)B2]−−−−−−−−−−−−−−−−√ C(x,y)=C ...

  6. SIFT,SURF,ORB,FAST 特征提取算法比较

    SIFT,SURF,ORB,FAST 特征提取算法比较 主要的特征检测方法有以下几种,在一般的图像处理库中(如OpenCV, VLFeat, Boofcv等)都会实现. FAST ,Machine L ...

  7. 输入参数的数目不足_机器学习算法—KMEANS算法原理及阿里云PAI平台算法模块参数说明...

    概述: KMEANS算法又被成为K均值算法,是一种常用的聚类算法,由于不需要根据给定的训练集训练模型因此是一种无监督学习算法.其本质是根据选定的参数K将数据分类成K类,在聚类过程中从单一样本开始通过不 ...

  8. DL之FastR-CNN:Fast R-CNN算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略

    DL之FastR-CNN:Fast R-CNN算法的简介(论文介绍).架构详解.案例应用等配图集合之详细攻略 目录 Fast R-CNN算法的简介(论文介绍) 1.实验结果 2.Fast R-CNN算 ...

  9. JavaScript实现Fast Powering算法(附完整源码)

    JavaScript实现Fast Powering算法(附完整源码) fastPowering.js完整源代码 fastPowering.js完整源代码 export default function ...

最新文章

  1. springboot 使用i18n进行国际化
  2. html5 canvas 实现一个简单的叮当猫头部
  3. DCMTK:使用dcmsr API创建示例结构化报告
  4. oracle中文加密算法,Oracle数据库替代加密算法
  5. 在Linux下写一个简单的驱动程序
  6. android edittext的监听,android editText 监听事件
  7. spring aop获取目标对象的方法对象(包括方法上的注解)(转)
  8. 计算机应用基础000,《计算机应用基础》教学导案000001.doc
  9. 网关转发其他微服务后头信息拿不到_微服务之基于Zuul自研服务网关
  10. android instrumentation 用法,android测试之——Instrumentation(一)
  11. 计算机中rom的意思是什么,ROM 是什么意思
  12. java英语apple_apple是什么意思_apple在线翻译_英语_读音_用法_例句_海词词典
  13. 详解3D结构光如何标定
  14. 【C语言-11】Bingou! ~~~~三个数字从大到小排排坐~~
  15. 期末考试查分,基于青果高校教务系统的一个自动python脚本代码。
  16. 1.EKL在项目中担当的位置
  17. R语言绘制Cleverland点图
  18. 07uec++多人游戏【瞄准镜效果】
  19. 用R进行文本分析初探——以《红楼梦》为例
  20. C语言——常量,变量

热门文章

  1. Vs code怎样查看pdf文件
  2. [FROM WOJ]#1749 树的统计(zjoi2008)
  3. SPSS学习笔记——对应分析
  4. P2P金融,终将成为主流
  5. 在moss上自己总结了点小经验。。高手可以飘过 转贴
  6. 国内k8s集群部署的几种方式
  7. GSMA公布2019“与CTIA合作的MWC洛杉矶”的新增主题演讲嘉宾名单和最新活动进展
  8. 2021年中国传媒产业发展趋势:产业持续增长,细分领域呈现两极化[图]
  9. 综合实验 电子记事本的设计与实现——Java
  10. 艾灵网络完成战略轮融资