Chan-Vese分割

Chan-Vese分割算法用于分割没有明确边界的对象。该算法基于迭代地进化以最小化能量的水平集,该能量由对应于来自分割区域外部的平均值的差异强度之和、来自分割区域内部的平均值的差的总和以及依赖于分割区域的边界的长度的项来定义。

该算法最早是由Tony Chan和Lumita Vese在题为《没有边的主动轮廓模型》的出版物中提出的 1. 另请参阅 2, 3.

该算法的这种实现在某种意义上被简化了,因为在原始论文中描述的面积因子‘nu’没有被实现,并且仅适用于灰度图像。

的典型值 lambda1lambda2 1.如果背景在分布方面与分割的对象非常不同(例如,具有不同强度的图形的均匀黑色图像),则这些值应该彼此不同。

的典型值 mu 介于0和1之间,尽管在处理轮廓定义非常模糊的形状时可以使用更大的值。

该算法还返回与每次迭代中的能量相对应的值列表。这可用于调整上述各种参数。

参考文献

1

没有边的主动轮廓模型,Tony Chan和Lumita Vese,计算机视觉中的尺度空间理论,1999, DOI:10.1007/3-540-48236-9_13

2

Chan-Vese分割,Pascal Getreuer,在线图像处理,2(2012),第214-224页, DOI:10.5201/ipol.2012.g-cv

3

Chan-Vese算法--项目报告,Rami Cohen,2011 arXiv:1107.2782

Original Image, Chan-Vese segmentation - 200 iterations, Final Level Set, Evolution of energy over iterations

输出:

/scikit-image/doc/examples/segmentation/plot_chan_vese.py:52: FutureWarning:

`max_iter` is a deprecated argument name for `chan_vese`. It will be removed in version 1.0. Please use `max_num_iter` instead.

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_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 = "Chan-Vese segmentation - {} iterations".format(len(cv[2]))
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分6.536秒)

Gallery generated by Sphinx-Gallery