标题 SLIC superpixel算法
作者 YangZheng
联系方式 263693992

SLIC算法是simple linear iterative cluster的简称,该算法用来生成超像素(superpixel)。

基本思想

算法大致思想是这样的,将图像从RGB颜色空间转换到CIE-Lab颜色空间,对应每个像素的(L,a,b)颜色值和(x,y)坐标组成一个5维向量V[l, a, b, x, y],两个像素的相似性即可由它们的向量距离来度量,距离越大,相似性越小。

算法首先生成K个种子点,然后在每个种子点的周围空间里搜索距离该种子点最近的若干像素,将他们归为与该种子点一类,直到所有像素点都归类完毕。然后计算这K个超像素里所有像素点的平均向量值,重新得到K个聚类中心,然后再以这K个中心去搜索其周围与其最为相似的若干像素,所有像素都归类完后重新得到K个超像素,更新聚类中心,再次迭代,如此反复直到收敛。怎么样,是不是感觉很像K-means聚类算法。

该算法接受一个参数K,用于指定生成的超像素数目。设原图有N个像素,则分割后每块超像素大致有N/K个像素,每块超像素的边长大致为S=[N/K]^0.5,开始我们每隔S个像素取一个聚类中心,然后以这个聚类中心的周围2S*2S为其搜索空间,与其最为相似的若干点即在此空间中搜寻。这里有一个问题,为了避免所选的聚类中心是边缘和噪声这样的不合理点,算法做了改进, 在3*3的窗口中将聚类中心移动到梯度最小的区域,梯度定义为:

这样就可以避免上面所说的情况。

最后可能出现一些小的区域d被标记为归属某一块超像素但却与这块超像素没有连接,这就需要把这块小区域d重新归类为与这块小区域d连接的最大的超像素中去,以保证每块超像素的完整。

算法详解

1 初始化聚类中心

初始化聚类中心,因为算法给定了距离,所以算法的初始中心为所划分区域的中心,即根据所给定的数量,划定所属类别的初始地区,如下图红框所示:

现在我们要将N为9的9*9的图像划分成为k为4的4个大小接近的超像素,做法就是首先以步距为

的距离划分超像素,然后将中心位置的结点为超像素的中心结点。设置中心像素的时候论文还进行了进一步的处理,即在中心结点的3*3领域内选取梯度最小的点作为初始超像素的中心结点,也就是下图中分别取黄色区域中梯度最小的点作为中心结点,好处是可以避免将超像素定位在边缘上,并且减少用噪声像素接种超像素的机会。不过官网上给出的matlab代码和下面要分析的南开大学给出的源码并没有进行这一步操作。个人觉得进行这步操作效果会得到改善,不过改善效果有限,有没有这一步影响不大,一个像素的间距对像素颜色的影响有限。


2 计算距离,跟新质心

其中m表示空间和像素颜色的相对重要性的度量。当m大时,空间邻近性更重要,并且所得到的超像素更紧凑(即它们具有更低的面积与周长比)。当m小时,所得到的超像素更紧密地粘附到图像边界,但是具有较小的规则尺寸和形状。当使用CIELAB色彩空间时,m可以在[1,40]的范围内。

第二个比较新颖的地方是计算距离的时候作者与传统的采用Kmeans进行分割的算法不同,并不是对整个空间的所有像素进行计算,而是限定了区域,区域大小为2S,即寻找时以初始聚类中心为寻找中心,确定一个2S*2S的矩形,如下图所示:

图1:减少超像素搜索区域。SLIC的复杂性在图像O(N)中的像素数目中是线性的,而常规的k均值算法是O(kNI),其中I是迭代次数。这在分配步骤中提供了每个聚类中心的搜索空间。(a)在常规k均值算法中,从每个聚类中心到图像中的每个像素计算距离。(b)SLIC仅计算从每个聚类中心到2S×2S区域内的像素的距离。注意,期望的超像素大小仅为S×S,由较小的正方形表示。这种方法不仅减少了距离计算,而且使得SLIC的复杂性与超像素的数量无关。

好处是显而易见的,限制搜索区域的大小显着地减少了距离计算的数量,这样可以极大的加快速度,可以将算法控制为线性复杂度。

接着便是对kMeans算法进行迭代,直到算法收敛或迭代次数大于某一个值,根据论文大部分图像在迭代次数为10以内,具体迭代思路如下:


3 合并孤立点

采用连通分量算法进行进一步的处理,这一步是我一开始不太明白的地方,不太懂什么是孤立的结点。直到我调试代码才明白,即迭代完成后有可能产生如下图所示的形状,图中的黄色方框所框出的结点也就是所谓的孤立点,为了使分割效果更好,我们通常不希望存在这种结点,于是可以采用连通分量进行下一步地修正。

图中的绿框为类别2的搜索范围,所以有可能产生图中黄色框中的孤立结点

作者采用的连通分量的概念来解决这个问题,简单说来就是,根据4邻域连通或8邻域连通(代码采用的是4邻域的连接方式)的连通算法,则图中的黄色方框皆为一个联通分量,判断这个联通分量的面积,如果面积过小,则将联通分量的分类分给最近的类别,即左上角的两个2分为1,左下角分为3,右下角分为4(具体的实现可以参看代码)。

图解算法

实现代码

https://github.com/csjy309450/SLIC-Superpixels

参考资料:

http://www.2cto.com/kf/201611/562258.html

http://blog.csdn.net/u013593585/article/details/52043424

SLIC superpixel算法的更多相关文章

  1. SLIC superpixel实现分析

    http://infoscience.epfl.ch/record/149300这是SLIC算法的官网,网站有和SLIC相关的资源. SLIC主要运用K-means聚类算法进行超像素的处理,聚类算法中 ...

  2. 实现SLIC算法生成像素画

    前言 像素风最早出现在8bit的电子游戏中,受制于电脑内存大小以及显示色彩单一, 只能使用少量像素来呈现内容,却成就了不少经典的像素游戏.随着内存容量与屏幕分辨率的提升,内存与显示媒介的限制不再是问题 ...

  3. SuperPixel

    目录 SLIC Superpixel algorithm 距离函数的选择 代码 Gonzalez R. C. and Woods R. E. Digital Image Processing (For ...

  4. 《SLIC Superpixels》阅读笔记

    原始链接:http://blog.csdn.net/jkhere/article/details/16819285 或许有改动,请参考原文! SLIC 超像素(SLICSuperpixels) Rad ...

  5. Python: PS 图像特效 — 抽象画风

    今天介绍一种基于图像分割和color map 随机采样生成一种抽象画风的图像特效,简单来说,就是先生成一张 color map 图,颜色是渐变的,然后针对要处理的图像,进行分割,这里用的是 SLIC ...

  6. 超像素经典算法SLIC的代码的深度优化和分析。

    现在这个社会发展的太快,到处都充斥着各种各样的资源,各种开源的平台,如github,codeproject,pudn等等,加上一些大型的官方的开源软件,基本上能找到各个类型的代码.很多初创业的老板可能 ...

  7. 机器学习:simple linear iterative clustering (SLIC) 算法

    图像分割是图像处理,计算机视觉领域里非常基础,非常重要的一个应用.今天介绍一种高效的分割算法,即 simple linear iterative clustering (SLIC) 算法,顾名思义,这 ...

  8. SILC超像素分割算法详解(附Python代码)

    SILC算法详解 一.原理介绍 SLIC算法是simple linear iterative cluster的简称,该算法用来生成超像素(superpixel) 算法步骤: 已知一副图像大小M*N,可 ...

  9. 跑superpixel的程序

    知乎上对superpixel的讲解还不错:https://www.zhihu.com/question/27623988 superpixel的算法有很多,opencv中也包含了很多,我找了一个比较经 ...

随机推荐

  1. 【学习笔记】Hibernate关联映射(Y2-1-6)

    Hibernate关联映射 关联映射就是将关联关系映射到数据库里,在对象模型中就是一个或多个引用. 1.单向多对一关联 准备数据库 部门表和员工表 其中部门表有两列 部门编号和名称 员工表有三列 员工 ...

  2. 可拖动布局之Gridster

    看过bootstrap可视化布局系统的人是不是都会对页面元素的拖拽有着很大的兴趣?下面呢,楼主就给大家讲两个楼主知道的拖拽小插件吧. 一.gridster 1.了解gridster 后续官网:http ...

  3. 机器学习实战 之 KNN算法

    现在 机器学习 这么火,小编也忍不住想学习一把.注意,小编是零基础哦. 所以,第一步,推荐买一本机器学习的书,我选的是Peter harrigton 的<机器学习实战>.这本书是基于pyt ...

  4. thinkpad E480 用户初体验

    梦寐以求的E480终于到手了,经过几天使用之后,也该写一下用户体验了,也算是对这些天的调研的一个总结吧. 首先是外形,从外形上来看E480的外形的确是相对以前的塑料外壳,改进了不少,全金属的机身,磨砂 ...

  5. php留言板

    这个小项目的学习,就这样结束啦.由于过程中需要使用到js,这个目前还是感觉不会.之前的分析还是不太懂的.现在心里还是有点迷茫.什么都是照着葫芦画瓢. 我的拥有自己的东西才行.

  6. Nodejs的运行原理-libuv篇

    前言 这应该是Nodejs的运行原理的第7篇分享,这篇过后,短时间内不会再分享Nodejs的运行原理,会停更一段时间,PS:不是不更,而是会开挖新的坑,最近有在研究RPG Maker MV,区块链,云 ...

  7. Android动态改变App在Launcher里面的icon

    如果呆萌的产品童鞋让你动态更换App在Launcher里面的Icon,你怎么回答他,下文就提出一种实现该效果的方法. 原理1--activity-alias 在AndroidMainifest中,有两 ...

  8. mysql常用基础操作语法(十一)~~字符串函数【命令行模式】

    注:sql的移植性比较强,函数的移植性不强,一般为数据库软件特有,例如mysql有mysql的函数,oracle有oracle的函数. 1.concat连接字符串: 从上图中可以看出,直接使用sele ...

  9. RVDS4.0 + JLINK 调试 cortex-A9

    1.RVDS4.0的安装与破解 参看http://blog.csdn.net/cp1300/article/details/7772645这位大神的帖子吧,写的很详细. 2.JLINK驱动的安装 这里 ...

  10. Windows下基于ADS+J-Link 的ARM开发环境搭建

    在一般ARM编程教学和实验环境里,一般采用 ADS加+并口转Jtag板+H-Jtag的开发环境.但是这种方法最大缺点是需要机器上有一个并口.现在无论PC还是笔记本都很难有并口,因此采用USB接口调试器 ...