分割算法与超像素算法的比较

该示例比较了四种流行的低层图像分割方法。由于很难获得好的分割结果,而且好的定义往往取决于应用,这些方法通常用于获得过分割,也称为超像素。然后,这些超像素用作条件随机场(CRF)等更复杂算法的基础。

基于Felzenszwalb有效图的分割

本文提出了一种快速的二维图像分割算法 1 在计算机视觉领域很受欢迎。该算法有一个单一的 scale 影响段大小的参数。根据局部对比度的不同,分段的实际大小和数量可能会有很大差异。

1

有效的基于图形的图像分割,Felzenszwalb,P.F.和Huttenlocher,D.P.国际计算机视觉杂志,2004

快速移位图像分割

QuickShift是一种相对较新的2D图像分割算法,基于核化Mean-Shift的近似。因此,它属于局部模式搜索算法家族,适用于由颜色信息和图像位置组成的5D空间 2.

快速切换的好处之一是它实际上可以同时计算多个尺度上的分层分割。

QuickShift有两个主要参数: sigma 控制局部密度近似的比例, max_dist 在生成的分层分段中选择一个级别。在颜色空间中的距离和图像空间中的距离之间也存在权衡,由 ratio

2

模式搜索的快速转换和核方法,Vedaldi,A.和Soatto,S.欧洲计算机视觉会议,2008

基于SLiC-K均值的图像分割

该算法简单地在颜色信息和图像定位的5维空间中执行K-均值算法,因此与快速移位密切相关。由于聚类方法比较简单,所以效率很高。该算法必须在Lab颜色空间中工作才能获得较好的效果。该算法很快获得了发展势头,现在得到了广泛的应用。看见 3 了解更多细节。这个 compactness 参数在颜色相似性和邻近性之间进行权衡,就像QuickShift的情况一样,而 n_segments 选择KMeans的中心数。

3

Radhakrishna Achanta,Appu Shaji,Kevin Smith,Aurelen Lucchi,Pascal Fua和Sabine Suesstrunk,SLIC超像素与最先进的超像素方法比较,TPAMI,2012年5月。

基于梯度图像的紧凑型分水岭分割

分水岭需要的不是彩色图像作为输入,而是灰度 渐变 图像,其中明亮的像素表示区域之间的边界。该算法将图像视为一幅风景,明亮的像素形成了高峰值。然后,这片土地被淹没在给定的 标记 ,直到不同的洪水流域在山顶相遇。然后,每个不同的盆地形成不同的图像段。 4

与SLIC一样,还有一个额外的 紧凑性 参数,使标记更难淹没遥远的像素。这使得分水岭区域的形状更加规则。 5

4

https://en.wikipedia.org/wiki/Watershed_%28image_processing%29

5

Peer Neubert&Peter Protzel(2014)。紧凑分水岭和抢占式SLIC:关于改进超像素分割算法的权衡。ICPR 2014,第996-1001页。 DOI:10.1109/ICPR.2014.181 https://www.tu-chemnitz.de/etit/proaut/publications/cws_pSLIC_ICPR.pdf

Felzenszwalbs's method, SLIC, Quickshift, Compact watershed

输出:

Felzenszwalb number of segments: 194
SLIC number of segments: 196
Quickshift number of segments: 695

import matplotlib.pyplot as plt
import numpy as np

from skimage.data import astronaut
from skimage.color import rgb2gray
from skimage.filters import sobel
from skimage.segmentation import felzenszwalb, slic, quickshift, watershed
from skimage.segmentation import mark_boundaries
from skimage.util import img_as_float

img = img_as_float(astronaut()[::2, ::2])

segments_fz = felzenszwalb(img, scale=100, sigma=0.5, min_size=50)
segments_slic = slic(img, n_segments=250, compactness=10, sigma=1,
                     start_label=1)
segments_quick = quickshift(img, kernel_size=3, max_dist=6, ratio=0.5)
gradient = sobel(rgb2gray(img))
segments_watershed = watershed(gradient, markers=250, compactness=0.001)

print(f"Felzenszwalb number of segments: {len(np.unique(segments_fz))}")
print(f"SLIC number of segments: {len(np.unique(segments_slic))}")
print(f"Quickshift number of segments: {len(np.unique(segments_quick))}")

fig, ax = plt.subplots(2, 2, figsize=(10, 10), sharex=True, sharey=True)

ax[0, 0].imshow(mark_boundaries(img, segments_fz))
ax[0, 0].set_title("Felzenszwalbs's method")
ax[0, 1].imshow(mark_boundaries(img, segments_slic))
ax[0, 1].set_title('SLIC')
ax[1, 0].imshow(mark_boundaries(img, segments_quick))
ax[1, 0].set_title('Quickshift')
ax[1, 1].imshow(mark_boundaries(img, segments_watershed))
ax[1, 1].set_title('Compact watershed')

for a in ax.ravel():
    a.set_axis_off()

plt.tight_layout()
plt.show()

脚本的总运行时间: (0分1.027秒)

Gallery generated by Sphinx-Gallery