水平集与图割算法浅析
LeveSet 水平集方法主要的思想是利用三维(高维)曲面的演化来表示二维曲线的演化过程。在计算机视觉领域,利用水平集方法可以实现很好的图像分割效果。
1.数学原理
根据维基百科的定义,在数学上一个包含n个变量的实值函数其水平集可以表示为下面的公式:
可以看出,水平集指的是这个函数的取值为一个给定的常数c.那么当变量个数为2时,这个函数的水平集就变味了一条曲线,也可以成为等高线。这时函数f就可以描述一个曲面。(同样,三个变量时就能得到一个等值面,大于3的就是水平超面了)
下面来看一个简单的曲面的水平集(等值线的例子):
上图中,左边是Himmelblau方程所描述的曲面即,右边就是这个曲面的等高线集合,其中每一条就对应着一个常数c的水平集。
2.水平集方法
在计算机视觉中,利用水平集方法的优势在于,可以利用这种方法在固定的坐标系中,计算曲线、曲面的演化,而无需知道曲线曲面的参数,所以这种方法又称为几何法。
具体来讲,在图像分割任务中如果要得到每个物体准确的包络曲线,就需要对去描述这个曲线在xy坐标系下的演化。最初曲线在二维图像平面上是这样的:
图割过程就是要找出一条比较好的曲面来包围物体。
但是这个函数求解和计算比较困难,那么就可以用水平集的思想和方法来解决:
1.首先将这个曲线看成是某个三维曲面下的某一条等高线:
就可以看做是一个xy的隐函数方程。
2.特别的,在二维图像领域一般将上面讲到的函数设置为0,刚刚所说的曲面的零水平集就是图像上的边缘包络。
或者更为标准的形式如下:
这时,z(x,y)=f(x,y)就是辅助函数,用三维的曲面来辅助表示二维的曲线。
这里还有一个假设,零水平集内部的(包络内的)为正外面为负。
这里有个重要的性质,基于高维曲面水平集方法得到的这个零水平集曲线是封闭的、连续的、处处可导的,这就为后面的图像分割提供了基础。
3.零水平集演化
为了获得与图像边缘相适应的结果,z需要进行演化才能使得其0水平集所描述的曲线很好的包裹住需要分割的物体,那么此时就涉及到方程的演化:
这里是一个曲面演化后,其零水平集演化的过程:
要促使边缘演化成包络object的形式,需要一个所谓的图像力来促使其变化,这时候就需要利用图像中的梯度来作为这个图像力的组成部分驱动曲线去靠近边缘。下图是一个例子,作图是原图,右图是梯度图。
<font color=dodgerblue<那么这个图像力就需要在原理边缘的时候大,靠近边缘的时候缩小,直到贴合边缘。
在梯度的驱动下,其演化过程如上图所示。
4.如何求解最小值
上面的问题在数学中可以归结为能量泛函问题,求解边缘的过程就是这个水平集能量泛函最小化的过程。
著名的方法来自于下面这篇文章:
Level Set Evolution Without Re-initialization: A New Variational Formulation
作者(李明纯)通过引入了内部能量项来惩罚由信号距离函数造成的水平集函数的偏差,以及外部能量项来驱动零水平集向期望的图像特征运动,实现了很好的分割效果。
5.Demo
下图是matlab 中,稍作修改运行作者给出的工具函数demo:
原图和分割效果图:
pics contenx ref from:
https://profs.etsmtl.ca/hlombaert/algorithms.php
https://math.berkeley.edu/~sethian/2006/Explanations/level_set_explain.html
https://www.zhihu.com/question/22608763
https://blog.csdn.net/github_35768306/article/details/64129197
https://blog.csdn.net/songzitea/article/details/46385271
李明纯:http://www.engr.uconn.edu/~cmli/
paper:http://www.imagecomputing.org/~cmli/paper/levelset_cvpr05.pdf
matlab:https://www.mathworks.com/matlabcentral/profile/authors/870631-chunming-li
https://blog.csdn.net/yutianxin123/article/details/69802364
cells: https://www.histology.leeds.ac.uk/blood/blood_wbc.php
https://www.thoughtco.com/cell-biology-glossary-373293