注意
转到结尾 下载完整的示例代码。或者通过 Binder 在浏览器中运行此示例
主动轮廓模型#
主动轮廓模型是一种将开放或闭合样条曲线拟合到图像中线条或边缘的方法 [1]。它通过最小化部分由图像定义、部分由样条形状(长度和平滑度)定义的能量来工作。最小化在形状能量中隐式进行,在图像能量中显式进行。
在以下两个示例中,使用了主动轮廓模型 (1) 通过将闭合曲线拟合到人脸边缘,将人脸从图像的其余部分分割出来;(2) 在遵循平滑度考虑的情况下,找到两个固定点之间的最暗曲线。通常,在分析之前稍微平滑图像是一个好主意,如下面的示例所示。
我们围绕宇航员的脸初始化一个圆圈,并使用默认边界条件 boundary_condition='periodic'
来拟合闭合曲线。默认参数 w_line=0, w_edge=1
将使曲线搜索朝向边缘,例如人脸的边界。
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, sigma=3, preserve_range=False),
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()
这里我们在两个点 (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, sigma=1, preserve_range=False),
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()
脚本的总运行时间:(0 分钟 2.016 秒)