窄带法最初由 D. Chop提出, Adalsteinsson 和 Sethian给出了详细的实现方法。基本思想是只演化位于零水平集周围很窄的一个带状区域水平集函数的值,而无需计算整个搜索空间中每一点的水平集函数值,以此来提高水平集方法的计算效率。如图 3-1所示,黑色的粗实线是当前的零水平集,两条细实线所包围的区域称为窄带区,更新水平集函数的时候,只对窄带区内部的网格点(图中黑色实心点,我们称之为激活点)更新。
于窄带宽度一般较窄,窄带内需更新的激活点不多,因此,更新水平集函数的计算量大大减小,这种方法将计算复杂度从全局算法的O(N3)降到了O(kN2),其中 N 为网格点的个数, k 为窄带的宽度。不过,窄带法存在的问题是经过几次迭代后,零水平集的位置可能超出窄带的范围,因此,需要经常更新窄带状水平集函数,使其保持为符号距离函数。更新的方式和窄带的宽度有关,如果窄带宽度很窄,一次迭代后,零水平集就有可能超出窄带范围,则需要每次更新,这将增加计算量;如果窄带度很宽,则需要更新的窄带内网格点比较多,计算量也增加;比较合理的窄带宽度是2δ=10~16。
窄带法的基本步骤如下:
(1) 给定初始轮廓线后,生成宽度为 k 的窄带,计算窄带中的点到曲线的最短距离,求出窄带点的有符号距离函数;
(2) 确定边界点和观察点:由于数值计算在窄带内进行,所以必须区分出窄带中的边界点。另外还必须设置一圈观察点,当零水平集曲线演化到观察点时,则必须重新初始化窄带。本文将紧靠边界点的窄带点设置成观察点,当其中一点的函数值符号改变时,则认为波前曲线已经接近窄带边界,需要在窄带中找出零水平集曲线,再以它为中心重新初始化窄带。
(3) 扩展速度项:窄带生成后,根据窄带点的有符号距离,用中心差分可以求出零水平集曲线上每一点的曲率。曲面演化的速度一般与零水平集曲线的曲率有关,而该速度只在零水平集上有定义,所以必须将曲率速度延拓到整个窄带。由于窄带的宽度一般较小,可使用如下的简单延拓方法:任一窄带点的曲率速度直接取零水平集曲线上与之最近的点的速度。在窄带生成算法中,已经求出了每个窄带点的曲线最近点,所以速度延拓很容易实现。
(4) 固定边界点,对窄带中的非边界点,根据水平集方程求下一时刻的φij ,直到零水平集曲线演化到观察点。
(5) 找出窄带中的零水平集曲线作为下一轮迭代的初始轮廓线,识别内、外点。若零水平曲线的位置不变或迭代次数超过给定的阈值则停止,否则跳转(1)。对窄带中每一个点,如果φij 的符号与其四邻域的符号相同,则该点不是演化曲线上的点,否则认为该点为演化曲线上的点;实际上应当通过该点与邻域点的符号由线性插值求出使φij=0 的点作为演化曲线上的点。为了提高计算效率,本文不进行插值处理而近似认为该点就在演化曲线上。最后一次跟踪零水平集曲线时,再通过插值方法求得近似于零水平集曲线的分段曲线,经验表明这种方法对图像分割的精度不会影响太大。得到一条近似的零水平集曲线后,结合φij的符号确定内部和外部点,以便重新初始化窄带。