python|scikit-image库--超像素分割算法比较(十一)

超像素分割算法比较 【python|scikit-image库--超像素分割算法比较(十一)】本例比较了四种常用的低阶图像分割方法。由于很难获得良好的分割,“良好”的定义往往取决于应用,这些方法通常用于获得过度分割,也称为超像素。然后,这些超像素作为更复杂的算法(如条件随机场(CRF))的基础。
基于菲尔森茨瓦布高效图的分割(Felzenszwalb’s efficient graph based segmentation.2004) 该算法有一个影响段大小的单尺度参数。实际大小和段数可能会有很大的差异,这取决于局部对比度。
快速移位图像分割(Quickshift image segmentation.2008) 快速移动是一种相对较新的二维图像分割算法,基于核平均移动的近似值。因此,它属于局部模式搜索算法家族,适用于由颜色信息和图像位置组成的5D空间。
Quickshift的一个好处是它实际上同时在多个尺度上计算分层分段。
Quickshift有两个主要参数:sigma控制局部密度近似值的比例,max-dist在生成的分层分段中选择一个级别。颜色空间中的距离和图像空间中的距离之间也存在着一种折衷,由比率给出。
基于SLIC-K均值的图像分割SLIC - K-Means based image segmentation.2012) 该算法简单地在5D颜色信息空间和图像位置空间中执行K均值,因此与快速移位密切相关。由于聚类方法简单,效率很高。该算法必须在实验室颜色空间中工作,才能获得良好的效果。该算法很快获得了势头,现在得到了广泛的应用。详见[3]。紧凑性参数权衡颜色相似性和接近性,就像快速移动一样,而n_段为kmeans选择中心数。
分水岭分割(Compact watershed segmentation .2014) 分水岭不需要以彩色图像作为输入,而是需要灰度渐变图像,其中亮像素表示区域之间的边界。该算法将图像视为一个景观,由亮像素形成高峰值。然后,这些景观被给定的标志淹没,直到单独的洪水流域在山峰处汇合。然后,每个不同的盆地形成不同的图像段。

import matplotlib.pyplot as plt import numpy as npfrom 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_floatimg = 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) 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("Felzenszwalb number of segments: {}".format(len(np.unique(segments_fz)))) print('SLIC number of segments: {}'.format(len(np.unique(segments_slic)))) print('Quickshift number of segments: {}'.format(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()

python|scikit-image库--超像素分割算法比较(十一)
文章图片

    推荐阅读