超像素分割算法比较 【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()
文章图片
推荐阅读
- 推荐系统论文进阶|CTR预估 论文精读(十一)--Deep Interest Evolution Network(DIEN)
- Python专栏|数据分析的常规流程
- Python|Win10下 Python开发环境搭建(PyCharm + Anaconda) && 环境变量配置 && 常用工具安装配置
- Python绘制小红花
- Pytorch学习|sklearn-SVM 模型保存、交叉验证与网格搜索
- OpenCV|OpenCV-Python实战(18)——深度学习简介与入门示例
- python|8. 文件系统——文件的删除、移动、复制过程以及链接文件
- 爬虫|若想拿下爬虫大单,怎能不会逆向爬虫,价值过万的逆向爬虫教程限时分享
- 分布式|《Python3网络爬虫开发实战(第二版)》内容介绍
- java|微软认真聆听了开源 .NET 开发社区的炮轰( 通过CLI 支持 Hot Reload 功能)