超像素分割算法比较

本例比较了四种常用的低阶图像分割方法。由于很难获得良好的分割,“良好”的定义往往取决于应用,这些方法通常用于获得过度分割,也称为超像素。然后,这些超像素作为更复杂的算法(如条件随机场(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 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)
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()

机器学习像素级预测 像素算法哪种好_机器学习像素级预测