SLIC超像素算法

一、前言

官网:https://www.epfl.ch/labs/ivrl/superpixels/
超像素是把一张图片中具有相似特征的像素进行聚类,形成一个更具有代表性的大“像素”。这个新的像素可以作为其他图像处理算法的基本单位,可以减低图像的维度和异常像素点。为了解现有方法的优点和缺点,我们比较了目前最好的五种超像素算法,比较的指标为图像边界的粘附性,算法速度,存储效率,以及它们对分割性能的影响。

这介绍简单的线性迭代聚类(SLIC)超像素算法,它采用k均值聚类方法高效地生成超像素。尽管它很简单,但SLIC较以前的算法可以更好地获取边界,同时,它具有更快的速度,更高的内存效率,并且能提高分割性能,也可以直接扩展到超体元生成。
关键词-超像素,分割,聚类,k均值。

目前常用的超像素分割算法有SLIC、SEEDS和LSC。
在这里插入图片描述
超像素算法将像素组合成感知有意义的原子区域( atomic regions),其可以用于替换像素网格的刚性结构。它们捕获图像冗余,提供计算图像特征的方便原语( primitive ),并且大大降低了后续图像处理任务的复杂性。
如果超像素用于构建具有更规则的晶格的图形,虽然很难定义指标来判断算法的优劣性,但我们相信以下属性通常是可取的:

  1. 超像素应当良好地粘附到图像边界。
  2. 当作为预处理步骤用于降低的计算复杂度时,超像素应当快速计算,存储 器效率高且易于使用。
  3. 当用于分割目的时,超像素应当增加速度并提高结果的质量。

下表提供了超像素方法进行了研究方法的定性和定量总结,速度,连接图,相对性能。
在这里插入图片描述

二、现有的超像素算法

2.1 基于图的算法

基于图形的超像素生成方法将每个像素视为图中的节点。两个节点之间的边权重与相邻像素之间的相似性成比例。超像素通过最小化图中定义的成本函数来创建。

NC05-归一化切割算法[23]递归地使用轮廓和纹理线索分割图像中的所有像素的图形,从而全局性地最小化在分割边界处的边缘定义的成本函数。它产生非常规则,视觉上令人愉快的超像素。然而,NC05的边界粘附相对较差,并且它是方法中最慢的(特别是对于大图像),尽管试图加速的算法存在[5]。NC05具有[15]的复杂度 O ( N 3 2 ) O(N^{\frac{3}{2}}) O(N23),其中N是像素的数量。

GS04-Felzenszwalb和Huttenlocher[8]提出了一种替代的基于图形的方法,已被应用于生成超像素。它将像素作为图的节点,使得每个超像素是组成像素的最小生成树。GS04在实践中很好地粘附到图像边界,但是产生具有非常不规则的尺寸和形状的超像素。它的复杂度是 O ( N log ⁡ N ) O(N\log N) O(NlogN),在实践中速度很快。然而,它不提供对超像素的量或其紧凑性的明确控制。

SL08-Mooreetal提出了一种通过确定将图像分割成更小的垂直或水平区域的最佳路径或接缝来生成符合网格的超像素的方法[21]。使用类似于SeamCarving[1]的图切割方法找到最佳路径。尽管作者给出的复杂的是 O ( N 3 2 log ⁡ N ) O(N^{\frac{3}{2}}\log N) O(N23logN),但这并不考虑预先计算的边界图,这强烈影响输出的质量和速度。

GCa10和GCb10-[26],Veksleretal。使用类似于[14]的纹理合成工作的全局优化方法。通过将重叠的图像块拼接在一起来获得超像素,使得每个像素仅属于重叠区域中的一个。这个方法有两个变种,一个用于生成紧凑超像素(GCa10),一个用于恒定强度超像素(GCb10)。

2.2 基于梯度上升的方法

从粗略的像素初始聚类开始,梯度上升法迭代地修改聚类,直到满足一些收敛标准以形成超像素。

MS02-In[4]中,平均偏移,用于定位密度函数的局部最大值的迭代模式寻找过程被应用于图像的颜色或强度特征空间中的第一模式。会聚到相同模式的像素定义超像素。MS02是一种较旧的方法,产生不均匀尺寸的不规则形状的超像素。它是复杂度 O ( N 2 ) O(N^2) O(N2),使其相对较慢,并且不提供对超像素的量,尺寸或紧密度的直接控制。

QS08-快速移位[25]也使用模式查找分割方案。它使用medoid移位过程初始化分割。然后将特征空间中的搜索点移动到最近的邻居,从而增加Parzen密度估计。虽然它具有相对良好的边界粘附,但是QS08的运行速度相当缓慢,具有复杂度 O ( d N 2 ) O(dN^2) O(dN2)(d是一个小常数[25])。而且QS08不允许对超像素的大小或数量的显式控制。以前的作品使用QS08对象定位[9]和运动分割[2]。

WS91-分水岭方法[28]从局部最小值开始执行梯度上升以产生分水岭,和分离集水盆地的线条。所得到的超像素在尺寸和形状上通常是高度不规则的,并且不表现出良好的边界粘附。[28]的方法相对较快(具有 O ( N log ⁡ N ) O(N\log N) O(NlogN) 的复杂度),但不提供对超像素量或其紧凑性的控制。

TP09-Turbopixel方法使用基于水平集的几何流动逐渐扩大一组种子位置[15]。几何流依赖于局部图像梯度,目的是在图像平面上规则地分布超像素。与WS91不同,TP09超像素被约束为具有均匀的尺寸,紧凑性和边界粘附。TP09依赖于不同复杂度的算法,但在实践中,如作者所声称的,具有大约 O ( N ) O(N) O(N) 的复杂度[15],是所检查的最慢的算法之一,并且表现出相对较差的边界粘附。

三、SLIC超像素

我们提出一种新的生成超像素的方法,比现有方法更快,更高的记忆效率,展示了目前最优的边界依从性,并提高了分割算法的性能。简单线性迭代聚类(SLIC)采用K均值算法生成超像素,相较与其他算法具有两个重要的区别:
1)通过将搜索空间限制为与超像素大小成比例的区域,显着地减少了优化中的距离计算的数量。这降低了像素数N的线性复杂度,并且与超像素k的数量无关。
2)加权距离度量组合颜色和空间接近度,同时提供对超像素的尺寸和紧凑性的控制。
SLIC类似于[30]中描述的用于深度估计的预处理步骤的方法,其没有在超像素方向进行研究。

3.1 算法详解

SLIC使用简单易懂。默认情况下,算法的唯一参数是k,其含义是大小大致相等的超像素的个数。对于CIELAB色彩空间中的彩色图像,聚类过程从初始化步骤开始,其中k个初始聚类中心 C i = [ l i , a i , b i , x i , y i , ] T C_i = [l_i,a_i,b_i,x_i,y_i,]^T Ci=[li,ai,bi,xi,yi,]T 在间隔S个像素的规则网格上采样。为了产生大致相等大小的超像素,网格间隔为 S = N k S =\sqrt{\frac{N}{k}} S=kN 。将中心移动到与3×3邻域中的最低梯度位置相对应的种子位置。这样做是为了避免将超像素定位在边缘上,并且减少用噪声像素接种超像素的机会。
接下来,在分配步骤中,每个像素i与搜索区域与其位置重叠的最近聚类中心相关联,如图2所示。这是加速我们的算法的关键,因为限制搜索区域的大小显着地减少了距离计算的数量,并且导致相对于常规kmeans聚类的显着的速度优势,其中每个像素必须与所有聚类中心比较。这只能通过引入距离测量D来实现,该距离测量D确定每个像素的最近聚类中心,如第III-B节中所讨论的。由于超像素的预期空间范围是近似尺寸S×S的区域,因此在超像素中心周围的区域2S×2S中进行类似像素的搜索。
在这里插入图片描述
图.2:减少超像素搜索区域。SLIC的复杂性在图像O(N)中的像素数目中是线性的,而常规的k均值算法是O(kNI),其中I是迭代次数。这在分配步骤中提供了每个聚类中心的搜索空间。
(a)在常规k均值算法中,从每个聚类中心到图像中的每个像素计算距离。
(b)SLIC仅计算从每个聚类中心到2S×2S区域内的像素的距离。注意,期望的超像素大小仅为S×S,由较小的正方形表示。这种方法不仅减少了距离计算,而且使得SLIC的复杂性与超像素的数量无关。

一旦每个像素已经与最近的聚类中心相关联,更新步骤将聚类中心调整为属于该聚类的所有像素的平均向量 [ l , a , b , x , y ] T [l,a,b,x,y]^T [l,a,b,x,y]T。L2范数用于计算新聚类中心位置和先前聚类中心位置之间的残差误差E.分配和更新步骤可以迭代重复,直到错误收敛,但我们发现10次迭代足够大多数图像,并报告本文中使用此标准的所有结果。最后,后处理步骤通过将不相交像素重新分配给附近的超像素来实施连通性。算法1中总结了整个算法。
在这里插入图片描述

3.2 距离测量

SLIC超像素对应于labxy颜色空间中的簇,这里提出了定义距离D的问题。D在算法1中的计算像素i和聚类中心 C k C_k Ck之间的距离,像素颜色在CIELAB颜色空间 [l a b]T中表示,其取值范围是已知的,另一方面,像素的位置 [x,y]T的取值范围随着图像的尺寸变化而变化。

简单定义D为labxy空间中的五维欧式距离将导致不同超像素大小的聚类行为的不一致性。对于大的超像素,空间距离超过颜色接近度,给出比空间接近度比颜色更多的相对重要性。这产生不良好的粘附到图像边界的紧凑超像素。对于较小的超像素,则相反。

为了将两个距离组合成单个测量,有必要通过它们在簇内的各自的最大距离 N s N_s Ns N c N_c Nc 来标准化颜色接近度和空间接近度。D为:
d c = ( l j − l i ) 2 + ( a j − a i ) 2 + ( b j − b i ) 2 d s = ( x j − x i ) 2 + ( y j − y i ) 2 D ′ = ( d c N c ) 2 + ( d s N s ) 2 (1) \begin{aligned} d_c&=\sqrt{(l_j-l_i)^2 +(a_j-a_i)^2 +(b_j-b_i)^2 } \\ d_s&=\sqrt{(x_j-x_i)^2 +(y_j-y_i)^2 } \\ D'&=\sqrt{\left ( \frac{d_c}{N_c} \right )^2 + \left ( \frac{d_s}{N_s} \right )^2 } \end{aligned} \tag1 dcdsD=(ljli)2+(ajai)2+(bjbi)2 =(xjxi)2+(yjyi)2 =(Ncdc)2+(Nsds)2 (1)

给定群集内预期的最大空间距离对应于采样间隔, N s = S = N K N_s = S =\sqrt{\frac{N}{K}} Ns=S=KN 。确定最大的颜色距离 N c N_c Nc 不是那么简单。因为颜色距离可以从簇到簇和图像到图像显著不同。这个问题可以通过将 N c N_c Nc固定为常数 m来避免,1变为:
D ′ = ( d c m ) 2 + ( d s S ) 2 (2) D' = \sqrt{\left ( \frac{d_c}{m} \right )^2 + \left ( \frac{d_s}{S} \right )^2} \tag2 D=(mdc)2+(Sds)2 (2)
这简化了我们在实践中使用的距离测量
D = d c 2 + ( d s S ) 2 m 2 (3) D = \sqrt{d_c^2 + \left ( \frac{d_s}{S} \right )^2m^2} \tag3 D=dc2+(Sds)2m2 (3)
通过以这种方式定义D,m还允许我们权衡颜色相似性和空间邻近度之间的想读重要性。当m大时,空间邻近性更重要,并且所得到的超像素更紧凑(即它们具有更低的面积周长比),当m小时,所得到的超像素更紧密的粘附到图像边界,但是具有较小的规则尺寸和形状。当使用CIELAB色彩空间时,m可以在 [1,40] 的范围内。

式(3)设置 d c = ( l j − l i ) d_c = \sqrt{(l_j-l_i)} dc=(ljli) 适用于灰度图像,它可以扩展到处理3D 超像素,深度维度到空间邻近项方程:
d s = ( x i − x j ) 2 + ( y i − y j ) + ( z i − x z j ) 2 d_s=\sqrt{(x_i-x_j)^2 +(y_i-y_j) +(z_i-xz_j)^2 } ds=(xixj)2+(yiyj)+(zixzj)2

在这里插入图片描述
图3:为视频序列计算的SLIC超体元。(顶部)短波的短视频序列所产生的帧。(左下)包含视频的卷。最后一帧出现在卷的顶部。(右下)视频的超像素分割。为便于显示,具有橙色聚类中心的超体素被去除。

3.3 后处理

像一些其他超像素算法[8],SLIC没有明确强制连接。在聚类过程结束时,可能保留不属于与其聚类中心相同的连接分量的一些“孤立”像素。为了对此进行校正,使用连通分量算法向这些像素分配最近聚类中心的标签。

3.4 时间复杂度

通过在聚类过程中的定位搜索,SLIC避免执行行数千个冗余距离计算。在实践中,像素落在小于8个聚类中心附近,这意味着SLIC是 O(N) 复杂度。相比之下,经典K均值算法的频繁上限是O(kN) ,时间复杂度O(kNI),其中I是收敛的迭代次数。虽然使用了像素长度随机抽样,局部簇交换以及通过设置上限和下限来降低K均值复杂度的方案。SLIC是专门针对超像素聚类的问题,它的时间复杂度在像素数量上是线性的,与K无关。

生物医学应用
许多流行的基于图形的分割方法,例如图切割[3]变得越来越昂贵,因为更多的节点被添加到图中,这在实践中会对图像大小产生限制。 对于一些应用,例如从电子显微照片(EM)的线粒体分割,这种情况下图像的尺寸是很大的,但是此时不能降低分辨率。 在这种情况下,在像素网格上定义的图形上的分割将是棘手的。 在[18],SLIC超像素显着降低图的复杂性,使分割易处理。 来自[18]的分段线粒体显示在 图3(a)和(b)。在[19],这种方法扩展到3D图像堆栈,其中可以包含数十亿的体素。 只有最节俭的算法可以在这样大量的数据上操作,而不需要以某种方式减小图的大小。 SLIC超体元将存储器要求和复杂性降低超过三个数量级,并且与常规立方体相比显着增加性能,如 图3(c) - (e)所示。
在这里插入图片描述
SLIC应用于来自神经组织的2D和3D EM图像的线粒体。
(a)来自EM切片的SLIC超像素。
(b)来自[18]的方法的分割结果。
(c)1024×1024×600体积的SLIC超体元。
(d)使用[19]中描述的方法提取的线粒体。
(e)比较SLIC超体元与相似尺寸的立方体在(c)中体积的分割性能。

四、Python-OpenCV示例

retval = cv.ximgproc.createSuperpixelSLIC( image[, algorithm[, region_size[, ruler]]] )

其中各个参数意义如下:
    image :输入图像
    algorithm:选择要使用的算法变体:SLIC、SLICO(默认)和MSLIC三种可选
    region_size:平均超像素大小,默认10
    ruler:超像素平滑度,默认10

import cv2

img = cv2.imread("./cat.png")

#初始化slic项,超像素平均尺寸20(默认为10),平滑因子20
slic = cv2.ximgproc.createSuperpixelSLIC(img,region_size=20,ruler = 20.0)
slic.iterate(10)                                    #迭代次数,越大效果越好
mask_slic = slic.getLabelContourMask()              #获取Mask,超像素边缘Mask==1
label_slic = slic.getLabels()                       #获取超像素标签
number_slic = slic.getNumberOfSuperpixels()         #获取超像素数目
mask_inv_slic = cv2.bitwise_not(mask_slic)
img_slic = cv2.bitwise_and(img,img,mask =  mask_inv_slic)  #在原图上绘制超像素边界
cv2.imshow("img_slic",img_slic)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
python-opencv: https://blog.csdn.net/qq_40268412/article/details/103915197
C++源码:https://blog.csdn.net/zhj_matlab/article/details/52986700
C++源码:https://github.com/csjy309450/SLIC-Superpixels
C++源码:https://blog.csdn.net/qq_40622955/article/details/120038943

  • 15
    点赞
  • 113
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值