备注
前往结尾 下载完整示例代码。或者通过 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 分钟 0.428 秒)