活动轮廓模型

活动轮廓模型是一种将开放或闭合的样条线与图像中的线或边进行拟合的方法 1. 它的工作原理是最小化部分由图像和部分由样条线形状定义的能量:长度和光滑度。最小化隐式地在形状能量中完成,而在图像能量中显式地完成。

在下面的两个例子中,活动轮廓模型被用来(1)通过将闭合曲线拟合到人脸的边缘来将人脸从图像的其余部分中分割出来,以及(2)在遵循平滑考虑的情况下找到两个固定点之间最暗的曲线。通常,在分析之前对图像进行一些平滑处理是个好主意,如下面的示例所示。

我们初始化宇航员面部周围的圆圈,并使用默认的边界条件 boundary_condition='periodic' 以拟合一条闭合曲线。默认参数 w_line=0, w_edge=1 将使曲线向边搜索,例如面的边界。

1

蛇:活动轮廓模型 。《计算机视觉国际期刊》1(4):321(1988)。 DOI:10.1007/BF00133570

import numpy as np
import matplotlib.pyplot as plt
from skimage.color import rgb2gray
from skimage import data
from skimage.filters import gaussian
from skimage.segmentation import active_contour


img = data.astronaut()
img = rgb2gray(img)

s = np.linspace(0, 2*np.pi, 400)
r = 100 + 100*np.sin(s)
c = 220 + 100*np.cos(s)
init = np.array([r, c]).T

snake = active_contour(gaussian(img, 3),
                       init, alpha=0.015, beta=10, gamma=0.001)

fig, ax = plt.subplots(figsize=(7, 7))
ax.imshow(img, cmap=plt.cm.gray)
ax.plot(init[:, 1], init[:, 0], '--r', lw=3)
ax.plot(snake[:, 1], snake[:, 0], '-b', lw=3)
ax.set_xticks([]), ax.set_yticks([])
ax.axis([0, img.shape[1], img.shape[0], 0])

plt.show()
plot active contours

在这里,我们初始化两点之间的直线, (5, 136)(424, 50) ,并通过给出边界条件来要求样条线的终点在那里 boundary_condition='fixed' 。此外,我们还通过给出一个负数来使算法搜索暗线 w_line 价值。

img = data.text()

r = np.linspace(136, 50, 100)
c = np.linspace(5, 424, 100)
init = np.array([r, c]).T

snake = active_contour(gaussian(img, 1), init, boundary_condition='fixed',
                       alpha=0.1, beta=1.0, w_line=-5, w_edge=0, gamma=0.1)

fig, ax = plt.subplots(figsize=(9, 5))
ax.imshow(img, cmap=plt.cm.gray)
ax.plot(init[:, 1], init[:, 0], '--r', lw=3)
ax.plot(snake[:, 1], snake[:, 0], '-b', lw=3)
ax.set_xticks([]), ax.set_yticks([])
ax.axis([0, img.shape[1], img.shape[0], 0])

plt.show()
plot active contours

脚本的总运行时间: (0分0.696秒)

Gallery generated by Sphinx-Gallery