注記
最後まで移動で、完全なサンプルコードをダウンロードできます。または、Binder経由でブラウザでこの例を実行できます。
アクティブ輪郭モデル#
アクティブ輪郭モデルは、画像内の線またはエッジに開いたスプラインまたは閉じたスプラインを適合させる手法です[1]。これは、画像によって定義される部分とスプラインの形状(長さ、滑らかさ)によって定義される部分で構成されるエネルギーを最小化することによって機能します。最小化は、形状エネルギーでは暗黙的に、画像エネルギーでは明示的に行われます。
次の2つの例では、アクティブ輪郭モデルを使用して(1)閉じた曲線を顔のエッジに適合させることで、画像の残りの部分から人の顔をセグメント化し、(2)滑らかさを考慮しながら、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()

ここでは、2点(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秒)