superpixels(超像素)

1.理解:

超像素不是在普通的像素基础上继续微观细分,超像素是一系列像素的集合,这些像素具有类似的颜色、纹理等特征,距离也比较近。其中超像素比较常用的一种方法是SLIC

  • Semantic Segmentation(语义分割):把图像中每个像素赋予一个类别标签(比如汽车、建筑、地面、天空等),比如把图像分为了草地(浅绿)、人(红色)、树木(深绿)、天空(蓝色)等标签,用不同的颜色来表示。
  • Instance Segmentation(实例分割):有点类似于物体检测,不过物体检测的输出一般是bounding box,实例分割输出是一个mask
  • panoptic segmentation(全景分割):他是语义和实例分割的结合。

SLIC 超像素分割算法 python 超像素分类_像素点

SLIC超像素

简单的线性迭代聚类,将彩色图像转化为CIELAB颜色空间和XY坐标下的5维特征向量,然后对5维特征向量构造距离度量标准,对图像像素进行局部聚类的过程。SLIC算法能生成紧凑、近似均匀的超像素,在运算速度,物体轮廓保持、超像素形状方面具有较高的综合评价

SLIC的优点:

1.生成的超像素如同细胞一般紧凑整齐,领域特征比较容易表达,这样基于像素的方法可以很容易改造维基于超像素的方法

2.不仅可以分割彩色图,还可以分割灰度图

3.需要设置的参数非常少,默认情况下只需要设置一个预分割的超像素的数量

4.相比其他超像素分割方法,SLIC在运行速度、生成超像素的速度、轮廓保持方面都比较理想

SLIC实现的步骤:

1.初始化种子点(聚类中心):按照规定的超像素个数,在图像内均匀的分配种子点。假设图片总共有N个像素点,预分割为为K个相同尺寸的超像素,那么每个超像素的大小为N/K,则相邻种子点的距离(步长)近似为S=sqrt(N/K)(聚类过程从初始化步骤开始,k个聚类中心在间隔S个像素的规则网格上采样,为了产生大致相等的超像素,网络间隔为S=(N/k)^1/2)。

2.在种子点的n*n(n=3)邻域内重新选择种子点:将中心移动到3X3领域中的最低梯度位置相对应的种子位置。这样是为了避免超像素定位在边缘上,并且减少用噪声像素接触超像素的机会,以免影响后续的聚类效果。

3.在每个种子点周围的领域内为每个像素点分配标签。(每个像素i与搜索区域与其位置重叠的最近聚类中心相关联,由于限制搜索区域的大小显着地减少了距离计算的数量,并且导致相对于常规kmeans聚类的显着的速度优势,其中每个像素必须与所有聚类中心比较,对该算法加速起到了作用。

SLIC 超像素分割算法 python 超像素分类_像素点_02

4.这只能通过引入距离测量D来实现,该距离测量D确定每个像素的最近聚类中心

SLIC 超像素分割算法 python 超像素分类_算法_03


其中dc代表颜色距离,ds代表空间距离,Ns是类内最大空间距离,定义为Ns=S=sqrt(N/K),适用于每个聚类。最大的颜色距离Nc既随图片不同而不同,也随聚类不同而不同,所以我们取一个固定常数m(取值范围[1,40],一般取10)代替。最终的距离度量D’:

SLIC 超像素分割算法 python 超像素分类_计算机视觉_04


由于每个像素点都会被多个种子点搜索到,所以每个像素点都会有一个与周围种子点的距离,取最小值对应的种子点作为该像素点的聚类中心。

5.迭代优化。理论上上述步骤不断迭代直到误差收敛(可以理解为每个像素点聚类中心不再发生变化为止),10次迭代对绝大部分图片都可以得到较理想效果,所以一般迭代次数取10(L2范数用于计算新聚类中心位置和先前聚类中心位置之间的残差误差E)

6.将不相交像素重新分配给附近的超像素来实施连通性

算法如下:

算法 SLIC超像素分割

/*初始化*/
通过以步长S对像素进行采样初始化聚类中心Ck=[lk,ak,bk,xk,yk]T
移动聚类中心到3X3中梯度最小的位置
设置标签l(i)=-1对每个像素i
设置距离d(i)=无穷 对灭个像素i
重复
/*分配*/
for 每个聚类中心Ck
    for 每个像素i在Ck周围的2SX2S区域
    计算Ck与i的距离D
       if D<d(i)
          d(i) = D
          l(i)=k
          
       ENDIF
    ENDFOR
 
ENDFOR
/*更新*/
计算新的聚类中心
计算残差E
直到计算E<=阈值