在解离散测地线问题中,Fast Marching算法被广泛使用。其最大的优点是可以直接应用于点云数据。要知道,大部分内蕴几何算法需要原始数据提供连续的网格信息,才能够被使用。Fast Marching算法能够在没有网格信息的前提下,根据点云局部邻域的关系,利用波动方程计算点云内不同点的时间与距离的均匀变化,得到点云的标量距离场,其结果可以被近似的看作是测地距离计算结果。这对于点云数据几何特征分析具有十分重要的意义。
网上大部分关于Fast Marching算法的描述,都偏理论一些,涉及大量的数学概念。本文中,我们尽量简化那些复杂的概念,使读者能够用更快的速度上手Fast Marching算法的设计工作。本文的一些描述可能并不准确,很多都是基于我个人理解,不能作为严格意义上的教程,如果读者希望理解Fast Marching算法更加具体的细节,可阅读参考文献 [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]。
如果速度只依赖于空间位置与位置函数的一阶导数,那么两种波动方程模型能够转换为一般的汉密尔顿-雅可比方程。我的理解就是求解偏微分方程的方法。
H为汉密尔顿函数,Du为u的所有分量,x表示位置,α是0或1。假设α=0, , 转化为程函方程
这里汉密尔顿-雅可比方程的作用,我的理解是基于当前的状态和更早前的状态,估计下一步波动的结果。
这里引入一个流函数Flux Functions G的概念。G用于求出双曲守恒定律的解:
已知两点位置u1和u2, 流函数的数值解可以表示为:
这里的意思应该是估计的值应该满足水平集一个值大于等于0和一个值小于等于0的原则来进行的。
有一个例子比较容易理解该过程。步骤n的标量我们是知道的,我们希望求下一步的标量,即n+1。
这里我们希望数据的更新符合流函数的更新规则,而更新结果能够基于当前结果进行数值逼近
能够被用来模拟:
如果更新符合守恒规则,那么更新应该符合非递减函数的性质。
流函数符合上述更新规则。对流函数进行建模,那么波动方程的数值模拟结果能够被计算出来(这里的描述非常像使用拉普拉斯算子在曲面上计算调和函数,当然这只是一个实例。关于水平集的叙述更一般化)。
为了求解,首先给出一个凸函数速度算法
其中U表示汉密尔顿雅可比方程解,使用u代替U,u为双曲守恒律的一个解,方程被改写为:
这个函数形式与之前的双曲守恒形式一致,所以能够近似的表示为流函数
这样凸函数速度算法能够转换为:
一维情况:
二维情况:
对于水平集来说:
前向与后向传播的符号定义:
算法使用速度函数F, 微分算子以及时间不长,以产生下一步的值。高阶模式能够被建立以得到更准确的结果,但是这里不再讨论。
Fast Mearching算法基于上述推导,可由
转换为:
简写为:
该二次型用于求解下一时间的标量值,而与时间步长无关。
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)
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.