SLIC算法介绍

article/2025/9/11 12:11:04

SLIC(simple linear iterativeclustering),即 简单线性迭代聚类 。
💛它是2010年提出的一种思想简单、实现方便的算法,将彩色图像转化为CIELAB颜色空间和XY坐标下的5维特征向量,然后对5维特征向量构造距离度量标准,对图像像素进行局部聚类的过程。
💛SLIC算法能生成紧凑、近似均匀的超像素,在运算速度,物体轮廓保持、超像素形状方面具有较高的综合评价,比较符合人们期望的分割效果。其实是从k-means算法演化的,算法复杂度是O(n),只与图像的像素点数有关,而与k值无关。而常规的k均值算法的复杂度是O(kni),i为迭代次数。

SLIC主要优点如下:
1)生成的超像素如同细胞一般紧凑整齐,邻域特征比较容易表达。这样基于像素的方法可以比较容易的改造为基于超像素的方法。
2)不仅可以分割彩色图,也可以兼容分割灰度图。
3)需要设置的参数非常少,默认情况下只需要设置一个预分割的超像素的数量。
4)相比其他的超像素分割方法,SLIC在运行速度、生成超像素的紧凑度、轮廓保持方面都比较理想。


超像素:

💛超像素概念是2003年Xiaofeng Ren提出和发展起来的图像分割技术。
💛是指具有相似纹理、颜色、亮度等特征的相邻像素构成的有一定视觉意义的不规则像素块。
💛它利用像素之间特征的相似性将像素分组,用少量的超像素代替大量的像素来表达图片特征(捕获图像的冗余信息),很大程度上降低了图像后处理的复杂度,所以通常作为分割算法的预处理步骤。
💛已经广泛用于图像分割、姿势估计、目标跟踪、目标识别等计算机视觉应用。需要注意的是,超像素分割算法很可能把同一个物体的不同部分分成多个超像素。

SLC的创新点:

1.SLIC限制聚类时搜索的区域(2Sx2S)————》原K均值算法中,计算的是聚类中心到图像中的每个像素的距离——》把k-means的算法复杂度降为常数,整个算法复杂度为线性
在这里插入图片描述
2.距离度量考虑lab颜色和xy距离,五维数据。 且可以考虑颜色和距离的比重,使超像素更加灵活。

SLIC算法步骤分析:

💚均匀撒k个种子并移动到梯度最小的地方——》为每个像素计算D并分配种子标签——》重新计算聚类中心——》增强区域连通性解决孤立点和超像素过小情况

💛对源文章过程的解析:
step1:初始化聚类中心且用五维数据表示,聚类中心 之间的间隔为S(步长s对像素进行采样,初始化聚类中心)
step2:移动聚类中心到33范围内梯度最低的地方
step3:对每一个像素i,设置label。取label第一个字母l表示label。l表示为每个像素点是属于哪个超像素,初始设置为-1
step4:对每个像素i,设置距离d(i)=正无穷 【ps.因为后面更新的时候,是根据距离数值小的点进行更新】
step5.循环以下过程————对每个聚类中心外循环,在围绕聚类中心的2s
2s范围内的对每个像素i内循环—》如果距离度量值D数值小,就更新d(i)的值,将label(i)设置为所对应的超像素
step6.计算新的聚类中心和先前聚类中心位置之间的残差误差E。迭代直到错误收敛。 【ps.一般迭代10次差不多了】
在这里插入图片描述


1.撒种子。根据图像大小和定义的超像素数目K,将k个超像素中心均匀分布到图像的像素点上。假设图片总共有 N 个像素点,预分割为 K 个相同尺寸的超像素,那么每个超像素的大小为N/ K ,则相邻种子点的距离(步长)近似为S=sqrt(N/K)。

2.调整种子位置。以k为中心的nn(一般n取3,故为33)范围内,将超像素中心移动到这9个点中梯度最小的点上。目的是为了避免超像素点落入噪点或边界处。

3.初始化数据。在每个种子点周围的邻域内为每个像素点分配类标签lable(即该像素点是属于哪个聚类中心的)。做法:取一个数组label,保存每个像素点是属于哪个超像素。dis数据保存像素点到它属于的那个超像素中心之间的距离。

4.更新数据。对每一个超像素中心x,在其2s*2s范围内搜索;如果点到超像素中心x的距离(五维)小于点到它原来属于的超像素中心的距离,说明这个点属于超像素x。(新距离小于旧距离,则点属于新范围。更新dis,更新label)----》每个像素必须与所有聚类中心比较,通过引入距离测量D值。**【期望的超像素尺寸为SS,但是搜索的范围是2S2S】【由于每个像素点都会被多个种子点搜索到,所以每个像素点都会有一个与周围种子点的距离,取最小值对应的种子点作为该像素点的聚类中心。】**

5.计算。对每一个超像素中心,重新计算它的位置(属于该超像素的所有像素的位置中心)以及lab值。

6.迭代4、5步骤。【理论上上述步骤不断迭代直到误差收敛(可以理解为每个像素点聚类中心不再发生变化为止),实践发现10次迭代对绝大部分图片都可以得到较理想效果,所以一般迭代次数取10。】

后处理步骤:

可能存在不属于任何聚类的孤立像素,可以使用联通分量算法对这些像素分配最近聚类中心的标签。
💛增强连通性。经过上述迭代优化可能出现以下瑕疵:出现多连通情况、超像素尺寸过小,单个超像素被切割成多个不连续超像素等,这些情况可以通过增强连通性解决。
💛主要思路是:新建一张标记表,表内元素均为-1,按照“Z”型走向(从左到右,从上到下顺序)将不连续的超像素、尺寸过小超像素重新分配给邻近的超像素,遍历过的像素点分配给相应的标签,直到所有点遍历完毕为止。

关键步骤:

4和5【用到了k-means算法的思想】
💛步骤4相当于:知道超像素点,然后再给定一系列像素点。将像素点分类到某一超像素类中。
💛步骤5相当于:计算某类超像素类中,像素点的中心,然后让超像素点移动到刚才计算出来的中心位置。
💛迭代相当于:再让所有像素点分到某一超像素圈圈中,然后重新计算像素点中的中心,移动超像素中心到刚才的中心。然后重复。

注意:SLIC和K-means的区别是SLIC加快了计算速度,即,进行步骤4时只计算超像素中心有限范围内的点。


Lab彩色空间介绍:

L:亮度。值域为0(黑)~100(白)
a:从洋红色至绿色的范围。(a为负数指代绿色,a为正数指代品红色)
b:从黄色至蓝色的范围。(b为负数指代蓝色,b为正数指代黄色)

💛LAB彩色模型的最大优点:弥补了RGB彩色模型中色彩不均匀的缺点。因为RGB模型在蓝色到绿色之间的过渡色彩过多,而绿色到红色之间又缺少黄色和其他颜色。故,选择LAB色彩模型,可以保留尽量宽阔的色域和颜色。【
1)不像RGB和CMYK色彩空间,Lab 颜色被设计来接近人类生理视觉。它致力于感知均匀性,它的 L 分量密切匹配人类亮度感知。因此可以被用来通过修改 a 和 b 分量的输出色阶来做精确的颜色平衡,或使用 L 分量来调整亮度对比。这些变换在 RGB 或 CMYK 中是困难或不可能的。
2)因为 Lab 描述的是颜色的显示方式,而不是设备(如显示器、打印机或数码相机)生成颜色所需的特定色料的数量,所以 Lab 被视为与设备无关的颜色模型。
3)色域宽阔。它不仅包含了RGB,CMYK的所有色域,还能表现它们不能表现的色彩。人的肉眼能感知的色彩,都能通过Lab模型表现出来。
另外,Lab色彩模型的绝妙之处还在于它弥补了RGB色彩模型色彩分布不均的不足,因为RGB模型在蓝色到绿色之间的过渡色彩过多,而在绿色到红色之间又缺少黄色和其他色彩。如果我们想在数字图形的处理中保留尽量宽阔的色域和丰富的色彩,最好选择Lab。

LAB色彩模型有L、A和B三个通道,L通道主要是亮度通道,L的值域由0(黑色)到100(白色)。A和B通道主要是负责色彩变换,a表示从洋红色至绿色的范围(a为负值指示绿色而正值指示品红),b表示从黄色至蓝色的范围(b为负值指示蓝色而正值指示黄色)。Lab颜色空间的优点:1)不像RGB和CMYK色彩空间,Lab 颜色被设计来接近人类生理视觉。它致力于感知均匀性,它的 L 分量密切匹配人类亮度感知。因此可以被用来通过修改 a 和 b 分量的输出色阶来做精确的颜色平衡,或使用 L 分量来调整亮度对比。这些变换在 RGB 或 CMYK 中是困难或不可能的。2)因为 Lab 描述的是颜色的显示方式,而不是设备(如显示器、打印机或数码相机)生成颜色所需的特定色料的数量,所以 Lab 被视为与设备无关的颜色模型。3)色域宽阔。它不仅包含了RGB,CMYK的所有色域,还能表现它们不能表现的色彩。人的肉眼能感知的色彩,都能通过Lab模型表现出来。另外,Lab色彩模型的绝妙之处还在于它弥补了RGB色彩模型色彩分布不均的不足,因为RGB模型在蓝色到绿色之间的过渡色彩过多,而在绿色到红色之间又缺少黄色和其他色彩。如果我们想在数字图形的处理中保留尽量宽阔的色域和丰富的色彩,最好选择Lab。


距离的度量:

如果直接将l,a,b,x,y拼接成一个矢量计算距离,当超像素的大小变化时,x,y的值可以取到非常大 ,比如如果一张图10001000,空间距离可以达到1000Sqr(2),而颜色距离最大仅10*Sqr(2),导致最终计算得到的距离值中,空间距离ds权重占比过大。

所以需要进行归一化,除以最大值即超像素点的初始宽度S,将值映射到[0,1]。

而颜色空间距离也会给到一个固定的值m来调节颜色距离与空间距离的影响权重,m取值范围为[1,40]。

最终距离公式为D。

在这里插入图片描述
m还允许我们权衡颜色相似性和空间邻近度之间的相对重要性。
当m时,(空间距离的权重越大)空间邻近性更重要,得到的超像素更紧凑(规则)
当m时,(颜色距离权重更大)超像素更紧密的附着到图像边界,但具有较小的规则尺寸和形状(不规则)


可改进的点

1.撒种子步骤,原来是根据图像大小和超像素数目均匀撒的。
💛改:在初始种子点的n*n(一般n取3)个邻域内寻找更优的像素进行撒种子——计算邻域内所有像素的梯度值,把梯度值最小的像素点设置为新的超像素种子点——避免种子点落入轮廓或边界上

2.更新种子点步骤,原来是在updaye_clusters函数中根据当前超像素的所有归属像素来更新位置。
💛改:迭代引入滤波——去除超像素归属范围内与中心点在颜色空间上差异过大的像素点,用剩下的像素点更新聚类中心

3.SLIC的多次迭代中,对每一块超像素都进行迭代。
💛改:有些超像素块在迭代多次后变化不大了,所以可以设置一个准则,即本次迭代后的效果与上一次差别不大,则之后就不对此区域进行迭代。nChanges会在迭代过程中变化 ,如果nChanges小于阈值 则说明当前的超像素块 与 上一次迭代后变化不大 则直接跳出本次迭代
文章:Compact Watershed and Preemptive SLIC: On improving trade-offs of superpixel segmentation algorithms

double preemptive_thresh_iteration = 0.01;		//设置的迭代阈值if(nChanges<preemptive_thresh_iteration*sz)		break;

http://chatgpt.dhexx.cn/article/Q5ZQuHoN.shtml

相关文章

LSC算法

1.问题 给定序列 X<x_1,x_2,…,x_m> Y<y_1,y_2,…,y_j> 求X和Y的最长公共子序列(LCS) 2.解析 X<x1,x2,x3,x4…,xi> Y<y1,y2,y3,y4…,yi> 如果Z<z1,z2,z3,z4…,zk>是他们的最长公共子序列 则&#xff1a; &#xff08;1&#xff09;xi yi&…

LCS算法详解

程序员编程艺术第十一章&#xff1a;最长公共子序列(LCS)问题 0、前言 程序员编程艺术系列重新开始创作了&#xff08;前十章&#xff0c;请参考程序员编程艺术第一~十章集锦与总结&#xff09;。回顾之前的前十章&#xff0c;有些代码是值得商榷的&#xff0c;因当时的代码只顾…

LCS 最大公共序列算法

这些天在了解chrome的courgette, 了解了rsync算法, 也了解了courgette使用了bsdiff 算法, 然后知道了bsdiff算法里主要使用的是 LCS 算法, 这里参考了july大牛的文章: http://blog.csdn.net/v_july_v/article/details/6695482 自己做一点概括性的总结, 用以备忘, 也把自…

最长公共子序列(LCS)算法

一、最长公共字串与最长公共子序列 最长公共子串&#xff08;Longest Common Substirng&#xff09; 子串是串的一个连续的部分&#xff0c;子串中字符的位置必须连续。 例如&#xff1a;有两个字符串ABCBDAB 和 BDCABA&#xff0c;则它们的最长公共子串是&#xff1a;AB。 …

LCS(longest common sequence)算法的实现(十分详细)

一、问题描述 有两个字符串&#xff0c;求二者的最长公共子序列。 最长公共子序列&#xff1a;不必连续但必须有序的子列&#xff08;与子串区分&#xff0c;子串是连续的&#xff09; 二&#xff1a;解决方法 第一种方法&#xff1a;穷举法 &#xff0c;就是一个一个的对比&a…

LCS算法

LCS算法 LCS算法&#xff1a; LCS是Longest Common Subsequence的缩写&#xff0c;即最长公共子序列。一个序列&#xff0c;如果是两个或多个已知序列的子序列&#xff0c;且是所有子序列中最长的&#xff0c;则为最长公共子序列。LCS不是唯一的&#xff0c;它可以有很多种&am…

Oracle中索引的原理

索引的概念 索引是一种数据库结构&#xff0c;能够就数据库中的某列提供快速查询&#xff0c;而不用检索整个表格&#xff08;官方的不行&#xff09;。 在 Oracle 数据库中&#xff0c;存储的每一行数据都有一个 rowID 来标识。当 Oracle 中存储着大量的数据时&#xff0c;意…

MongoDB索引原理及实践

背景 数据库的演进 随着计算机的发展&#xff0c;越来越多的数据需要被处理&#xff0c;数据库是为处理数据而产生。从概念上来说&#xff0c;数据库是指以一定的方式存储到一起&#xff0c;能为多个用户共享&#xff0c;具有更可能小的冗余&#xff0c;与应用程序彼此独立的…

MySql存储引擎和索引原理

转载 https://blog.csdn.net/tongdanping/article/details/79878302 注意&#xff1a; 1、索引需要占用磁盘空间&#xff0c;因此在创建索引时要考虑到磁盘空间是否足够 2、创建索引时需要对表加锁&#xff0c;因此实际操作中需要在业务空闲期间进行 MySQL支持诸多存储引擎&a…

MySQL之索引原理

1 简介 索引底层就是一种数据结构&#xff0c;空间换时间&#xff0c;能够帮助我们快速定位到对应的数据&#xff0c;就类似于字典里面的目录一样。 索引虽然能快速检索数据&#xff0c;但会影响数据修改的操作&#xff0c;而且索引存储在具体的文件&#xff0c;占用一定的空…

深入浅出数据库索引原理

使用索引很简单&#xff0c;只要能写创建表的语句&#xff0c;就肯定能写创建索引的语句&#xff0c;要知道这个世界上是不存在不会创建表的服务器端程序员的。然而&#xff0c; 会使用索引是一回事&#xff0c; 而深入理解索引原理又能恰到好处使用索引又是另一回事&#xff0…

MySQL索引原理和实现

说到索引&#xff0c;很多人都知道“索引是一个排序的列表&#xff0c;在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址&#xff0c;在数据十分庞大的时候&#xff0c;索引可以大大加快查询的速度&#xff0c;这是因为使用索引后可以不用扫描全表来定位某行的数…

倒排索引原理,即为什么叫倒排索引

倒排索引的英文原名是Inverted index&#xff0c;大概因为Invert有颠倒的意思&#xff0c;所以就被翻译成了倒排&#xff0c;然后我们就会在字面上出现误解&#xff1a;理解为从A-Z颠倒成Z-A。其实它并不是字面上的意思。 倒排索引源于实际应用中需要根据属性的值来查找记录&a…

【数据库】数据库索引原理

正确的创建合适的索引 是提升数据库查询性能的基础 文章目录 1.索引是什么&#xff1f;2.为什么&#xff1f;3.索引原理B tree 4.B tree 在两大引擎中的体现5.索引的原则 1.索引是什么&#xff1f; 索引是为了加速对表中数据行的检索而创建的一种分散存储的数据结构。 2.为…

Mysql数据库的索引原理

写在前面&#xff1a;索引对查询的速度有着至关重要的影响&#xff0c;理解索引也是进行数据库性能调优的起点。考虑如下情况&#xff0c;假设数据库中一个表有10^6条记录&#xff0c;DBMS的页面大小为4K&#xff0c;并存储100条记录。如果没有索引&#xff0c;查询将对整个表进…

MySql索引原理与使用大全

林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka 一、索引介绍 索引是对数据库表中一列或多列的值进行排序的一种结构。在关系数据库中&#xff0c;索引是一种与表有关的数据库结构&#xff0c;它可以使对应于表的SQL语句执行得更快。索引的作用相…

MySQL:索引原理

文章目录 1、索引概念1.1、使用场景1.2、索引代价 2、索引分类2.1、数据结构2.2、物理存储回表查询 & 覆盖索引 2.3、字段&#xff08;列&#xff09;属性2.3.1、主键索引主键的选择 2.3.2、唯一索引2.3.2、普通索引2.3.3、前缀索引 2.4、字段&#xff08;列&#xff09;个…

索引的原理和实现的方式

建立索引 需要有索引的类型和索引的方法。 索引的类型包括了Normal Unique Full text 而索引的方法包括了BTREE 和HASH 转载文章&#xff1a;https://www.cnblogs.com/aspwebchh/p/6652855.html 博主写的真好~ 一、什么是Btree B tree &#xff08;非二叉&#xff09; 了…

索引的实现原理

这篇文章是介绍MySQL数据库中的索引是如何根据需求一步步演变最终成为B树结构的以及针对B树索引的查询&#xff0c;插入&#xff0c;删除&#xff0c;更新等操作的处理方法。Oracle和DB2数据库索引的实现基本上也是大同小异的。文章写得很通俗易懂&#xff0c;就转在这了。关于…

MySQL索引的理解学习,面试不问索引原理就是事务原理

目录 MySQL执行SQL的整体流程 引言, MySQL索引底层学习原因 磁盘介绍(理解磁盘IO) 索引底层数据结构B树 B树(聚集索引) B树(辅助索引) 思考一下为何使用B树结构, 不是B树, 不是平衡树二叉树,红黑树&#xff1f; 索引总结 MySQL执行SQL的整体流程 显示需要跟MYSQL Serv…