snake是一种主动轮廓模型,是对主动轮廓模型的理解:你先给它一个初始轮廓,模型以初始轮廓为基准逐步迭代,来改进图像的轮廓,使其更加精确。主动轮廓模型目前用到了2种:CV和snake。前者没有看算法内部的原理。而snake,以最原始的论文《Snakes: Active Contour Models》为出发点。
1. snake原理
snake在逐步迭代优化过程的目标是能量函数最小化,这个能量函数指的是轮廓能量和图像能量的总和(为什么要最小化这个能量总和,还不太清楚,论文也没有具体说)。snake的目标不像sobel、canny等找到整张图的轮廓。它只搜索你给出的初始轮廓附近,达到轮廓更精确的目标,至少原版的snake只能达到局部优化的目标。
能量函数:
其中指当前轮廓本身的能量,称为内部能量,而指图像上轮廓对应点的能量,称为外部能量,应该是方差相关的项。
而内部能量由两部分构成:一阶导数的模(称为弹性能量)和二阶导数的模(弯曲能量)
为什么是这样的呢?据说是因为曲线曲率的关系,闭合的轮廓曲线中,凸曲线按照法向量的方向,具有向内的作用力;凹曲线法向量向外,具有向外的力。而曲率计算就是跟一阶导数、二阶导数相关的。很复杂,不甚理解。
在迭代过程中,弹性能量能快速的把轮廓压缩成光滑的圆;弯曲能量将轮廓拉成光滑的曲线或直线,他们的作用是保持轮廓的光滑和连续性。通常alpha越大,轮廓收敛越快;beta越大,轮廓越光滑。
外部图像能量作者分了三种:线性能量,通常更亮度相关;边缘能量,由图像的边缘组成,而边缘可以通过sobel算子计算;终端能量。
线性能量:
边缘能量:
终端(角点)能量:
通常可以根据更期望轮廓趋向于哪方面来选择以上三种能量。在迭代优化过程中,外部能量会使轮廓朝(灰度)高梯度位置靠近。而通常梯度高的位置都是图像中前景与背景的界限或者物体与物体之间、物体内部不同部分的界限,适合用于分割。
对于优化,优化的目标是总能量函数局部极小,通过能量函数极小或者迭代次数来控制迭代的终止。极小化能量函数通过欧拉方程计算解,作者在附录中用了数值方法进行推到,将欧拉方程推到为:
其中
引入外部能量:
再转化为每一步迭代演进过程:
A+ rI为五对角条带矩阵。
2. GVF snake
关于图像能量中line、edge、termatation计算其实都挺复杂的。反倒是计算梯度向量场简单一些。将图像能量由线、边缘、角点的能量替换为梯度向量场,就是GVF snake。