活动轮廓算法
活动轮廓模型(也称为蛇模型)是一个框架,用于拟合开或闭合样条曲线与图像中的线或边缘。这里的“蛇”是一种受约束、图像和内力影响的能量最小、可变形的样条曲线。因此,它通过部分由图像定义,以及部分由样条的形状、长度和平滑度定义的最小化能量来工作。约束和图像外力将“蛇”拉向目标轮廓,内力则抵抗变形。该算法围绕感兴趣的目标初始化蛇,并让它收缩或膨胀,以便于使封闭的轮廓与感兴趣的目标相拟合。在图像能量和形状能量中显式地实现了最小值。由于点的数量是恒定的,因此需
要确保初始的“蛇”有足够的点来捕捉最终轮廓的细节。
源自 scikit-image 文档的如下例子中的活动轮廓模型将被用来通过在人脸边缘拟合样条曲线,将宇航员的脸与图像的其余部分分割开来。在预处理步骤对图像进行了一些平滑处理。在宇航员的面部周围初始化一个圆圈,并使用默认边界条件bc='periodic’来拟合闭合曲线。欲使曲线搜索到边缘(例如脸部的边界),需使用默认参数值 w_line=0, w_edge=1。如下代码演示了如何使用 active_contour()函数进行分割(函数运行一个迭代算法,其中迭代算法的最大迭代次数可以由函数的参数指定),并显示在不同的迭代次数(max_iteration)下,在内部运行算法得到的闭合轮廓线。
#活动轮廓算法、形态学蛇算法和基于 OpenCV 的GrabCut 图像分割算法
# step1 活动轮廓算法
from skimage import data
from skimage.filters import gaussian
from skimage.segmentation import active_contour
img = data.astronaut()
img_gray = rgb2gray(img)
s = np.linspace(0, 2*np.pi, 400)
x = 220 + 100*np.cos(s)
y = 100 + 100*np.sin(s)
init = np.array([x, y]).T
i = 1
pylab.figure(figsize=(20,20))
for max_it in [20, 30, 50, 100]:
snake = active_contour(gaussian(img_gray, 3), init, alpha=0.015, beta=10, gamma=0.001, max_iterations=max_it)
pylab.subplot(2,2,i), pylab.imshow(img), pylab.plot(init[:, 0], init[:, 1], '--b', lw=3)
pylab.plot(snake[:, 0], snake[:, 1], '-r', lw=3)
pylab.axis('off'), pylab.title('max_iteration=' + str(max_it), size=20)
i += 1
pylab.tight_layout(), pylab.show()
运行上述代码。可以看到,初始圆是蓝色的虚线圆,活动轮廓算法迭代缩小轮廓(红线表示),从圆开始向人脸方向收缩,最后max_iteration=100
(最大迭代次数为 100)处,将自身与人脸边界相匹配,从而将人脸从图像中分割出来。