注意
前往結尾以下載完整的範例程式碼。或透過 Binder 在您的瀏覽器中執行此範例
Chan-Vese 分割#
Chan-Vese 分割演算法旨在分割沒有明確定義邊界的物件。此演算法基於水平集,透過迭代演變以最小化能量,該能量由加權值定義,這些加權值對應於分割區域外部與平均值的強度差總和、分割區域內部與平均值的強度差總和,以及一個取決於分割區域邊界長度的項。
此演算法最初由 Tony Chan 和 Luminita Vese 在一篇題為「An Active Contour Model Without Edges」的出版物中提出[1]。另請參閱[2]、[3]。
此演算法的實作在某種程度上經過簡化,原始論文中描述的面積因子「nu」未實作,且僅適用於灰階影像。
lambda1
和 lambda2
的典型值為 1。如果「背景」在分佈上與分割物件非常不同(例如,具有不同強度圖案的均勻黑色影像),則這些值應彼此不同。
mu
的典型值介於 0 和 1 之間,但在處理輪廓不明確的形狀時,可以使用較高的值。
此演算法也會傳回一個值清單,對應於每次迭代的能量。這可用於調整上述各種參數。
參考文獻#

import matplotlib.pyplot as plt
from skimage import data, img_as_float
from skimage.segmentation import chan_vese
image = img_as_float(data.camera())
# Feel free to play around with the parameters to see how they impact the result
cv = chan_vese(
image,
mu=0.25,
lambda1=1,
lambda2=1,
tol=1e-3,
max_num_iter=200,
dt=0.5,
init_level_set="checkerboard",
extended_output=True,
)
fig, axes = plt.subplots(2, 2, figsize=(8, 8))
ax = axes.flatten()
ax[0].imshow(image, cmap="gray")
ax[0].set_axis_off()
ax[0].set_title("Original Image", fontsize=12)
ax[1].imshow(cv[0], cmap="gray")
ax[1].set_axis_off()
title = f'Chan-Vese segmentation - {len(cv[2])} iterations'
ax[1].set_title(title, fontsize=12)
ax[2].imshow(cv[1], cmap="gray")
ax[2].set_axis_off()
ax[2].set_title("Final Level Set", fontsize=12)
ax[3].plot(cv[2])
ax[3].set_title("Evolution of energy over iterations", fontsize=12)
fig.tight_layout()
plt.show()
此腳本的總執行時間: (0 分鐘 4.440 秒)