Level Set方法简介

转载]Level Set方法简介(转载)

Level Set方法是美国数学家Osher(加州大学洛杉矶分校)和Sethian(加州大学伯克利分校)合作提出的。后者因为对Level Set的贡献获得了去年美国数学会与工业应用数学会联合颁发的维纳奖。遗憾的是这两位Level Set的开创者现在正为争夺Level Set的名誉而对簿公堂。

Level Set方法是他们在98年文章“Front Propagation with Curvature Depedent Speed: Algorithms Based on Hamilton-Jacobi Formulation"中第提出的。这个方法提出以后被成功地应用于流体力学,计算机图形学,材料科学等领域。应用于图像处理和计算机视觉始于93年Caselles等人和95年Malladi等人的两篇著名文章。他们用Level Set来表示Snakes,想法很简单:一个平面上的曲线可以表示成一个二元函数z=f(x,y)的零点集合(Zero Level Set),既这个二元函数z=f(x,y)所表示的三维曲面与xy平面的交线。更一般地,任何N维曲面都可以表示为一个N+1维曲面与一个N维超平面的交集,或称为N+1维曲面在一个N维超平面上的投影。相对最早的Snake(用参数化的曲线,所以也叫parametric active contour),用level set表示的活动曲线叫着Geometric Active Contours。

用二维曲面与二维平面的交线表示曲线,这在微积分甚至中学数学里都是很平凡的。但是,当我们要描述曲线运动的时候,用Level Set表示曲线就有很明显的优点。比如说,几条曲线在运动中merge成一条曲线,或一条曲线分裂成几条曲线,这样的拓扑变化是不可能表示成一条连续的参数化曲线的运动。原因很简单,一条连续的参数化曲线是用一个一元连续函数来卞表示的,它显然不能表示几条分开的曲线(这与连续性矛盾)。

然而,以上所说的曲线的拓扑变化却可以简单地表示成一个连续变化的的曲面与一个固定的平面的交线。这个曲面本身可以不发生拓扑变化,它可以始终是一个连续的二元函数z=f(x,y)的图象。这样,复杂的曲线运动就可以简单地表示成一个更高一维的函数的演化,这可以用一个发展方程(evolution equation)来描述,数学里已经有很多工具可以用了。


再接着说说level set吧。我这次参加CVPR,遇到很多人都说level set很难。我甚至还听说有个做snake很有名的教授对level set很反感。说实话,我在去年开始实现别人的level set方法时,也对level set越来越讨厌。原因是:现有的level set方法实现跟理论不一致(这在Gomes和Faugeras的文章里已经指出),需要搀杂不少remedies,比如最令人讨厌的re-initialization。还有一些步骤,比如velocity extension,都不是让人赏心悦目的东西。这些步骤就象长在人身上的赘肉或瘤,也许是良性的,但总是让人看着极不舒服,甚至怕它恶化。

但是,还是有些人能把这样复杂而且不是那么优美的方法实现出来,而且用得不错,具有其它很多方法不具备的优点,比如让曲线自然地split和merge。象任何一种理论和方法一样,尽管有缺点(比如re-initialization),但毕竟大家还是看到了它的巨大潜力。所以这还是成为一个很热的研究方向。

其实在我实现的别人的level set方法里面,很容易看到,即使对没有任何noise的图象,比如一个bianry的图象,里面只有一个简单的object(比如圆),level set function(LSF)的演化都很不稳定。问题出在对连续函数和PDE的离散化,还有就是speed function,不仅取决于level set本身,还取决于图象。即使在没noise的情况下,speed function在object boundary和其它地方是很不一样的,导致了不同level set的运动很不均匀,有的地方快,有的地方慢。所以我们会看到 LSF的等高线(即level sets)在有的地方很密,有的地方很稀,这会给进一步计算带来误差,甚至很快就发散了。这就是原有的level set方法需要每迭带几步停下来做re-initialization的原因。

有了re-initialization这样的remedy,这些方法对noise还是相当robust的,应该说比别的方法都robust。另外,象velocity extension这样的步骤,也对不同level set的运动起到更均匀的作用,使得LSF的演化更加稳定。

这只是对noise的robust。整个演化过程的稳定性和准确性还很依赖于什么时候停下来做reinitialization,怎么做,等等。

如果能找到一种方法,它在演化LSF的同时,又能自动维持LSF的良好性质,比如不太平也不太陡(最理想的就是signed distance function,它的坡度是45度,即切平面跟z轴的夹角是45度,不平不陡,正中间)。换句话说,我希望LSF的演化既是让Zero Level Set运动的过程,又是不断保持甚至提高整个LSF的良好形状的过程。这在现有的level set方法里面都不具备。我正是基于这个考虑,想到了我的方法(有兴趣请看我的CVPR文章)。

现在再回答几个问题。Level set方法并不需要你懂很多微分几何和微分方程的理论。对于前者,你只要知道怎么用隐函数来计算曲线的法方向和曲率。这在很多level set的文章或书中都有很易懂的介绍。对于微分方程,主要是知道怎么离散化去数值解。

对于Level Set的预备知识,我还得提一下变分法。也不是所有Level Set方法都需要变分法的。比如Osher和Sethian最初提出level Set时就不需要。基于变分法的level set方法,被称做variational level set methods。我的方法就是variational level set。

在很多高等数学的课本里都有变分法的基本内容,这就够用了。关键是学会怎么计算泛函的导数。首先要知道,泛函就是函数的函数,即泛函的变量本身就是一个函数。有了泛函的导数,就得到了所谓的gradient flow。直观的说,一个泛函的gradient flow就是这个泛函的变量(一个函数)朝着这个泛函的极小值点运动的过程。这跟普通函数求极小值的最速下降法(steepest decsent)是相似的。




posted @ 2015-04-30 14:28  wolowitz  阅读(3560)  评论(0编辑  收藏  举报