注意
前往結尾以下載完整的範例程式碼。或透過 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.480 秒)