SLIC超像素分割算法分析
1:导入原始照片,初始化聚类中心,按照设定的超像素个数,在图像内均匀的分配聚类中心。假设图片总共有 N 个像素点,预分割为 s 个相同尺寸的超像素,那么每个超像素的大小为N/ s ,则相邻种子点(聚类中心)的距离近似为S=sqrt(N/s)。
2:在种子点的n*n邻域内重新选择聚类中心。计算该邻域内所有像素点的梯度值,将种子点移到该邻域内梯度最小的地方,可以避免种子点落在梯度较大的轮廓边界上,以免影响后续聚类效果。
3:在每个种子点周围的邻域内为每个像素点进行分类,和标准的k-means在整张图中搜索不同,SLIC的期望的超像素尺寸为SS,但是搜索的范围是2S*2S。
4:距离度量。包括颜色距离和空间距离。对于每个搜索到的像素点,分别计算它和该种子点的距离,本质还是采用欧氏距离公式,计算方法如下:

其中,dc代表颜色距离,ds代表空间距离,Ns是类内最大空间距离。最大的颜色距离Nc既随图片不同而不同,也随聚类不同而不同,所以我们取一个固定常数m(1<m<40),一般取10代替。最终的距离度量D’如下:

由于每个像素点都会被多个聚类中心搜索到并计算其距离,最后选取最小的距离值作为该像素点的聚类中心。
5:迭代优化,一般达到迭代次数或者达到误差收敛(即每个像素点聚类中心不再发生变化为止)。
6:增强连通性。经过迭代优化可能出现多连通情况、超像素尺寸过小,单个超像素被切割成多个不连续超像素等,这些情况可以通过进行增强连通性解决。
7:基于SLIC超像素分割完毕,显示分割图像。
运行软件版本:MATLAB2014a(大于此版本即可)
运行方法:点击main.m文件,然后选择自己要超像素分割的照片即可。
MATLAB代码如下:
main.m文件
%选择要进行超像素分割图像的路径
close all;clc;
[filename, pathname, filterindex] = uigetfile(‘C:\Users\Hasee\Desktop\毕业设计\测试图库.jpg’, ‘选择图片’);
file = fullfile(pathname, filename);
%设置读取的照片为全局变量
global I;
%读取要选择的照片
I= imread(file);
figure,imshow(I);
title(‘原始图片’)
%利用SLIC函数处理待分割图像:
%超像素尺寸s=15,errTh为控制迭代结束的联合向量残差上限为10-2即0.01,控制色域与空域权重比例的系数wDs为0.52即0.25
s=15;
errTh=10^-2;
wDs=0.5^2;
Label=SLIC(I,s,errTh,wDs);
%% 显示轮廓
%矩阵初始化为矩阵
marker=zeros(size(Label));
%记录大小为m*n
[m,n]=size(Label);
for i=1:m
for j=1:n
top=Label(max(1,i-1),j);
bottom=Label(min(m,i+1),j);
left=Label(i,max(1,j-1));
right=Label(i,min(n,j+1));
if ~(topbottom && bottomleft && left==right)

本文详细解析了SLIC算法的步骤,从导入原始照片到聚类优化,再到增强连通性,最后展示了MATLAB实现过程。重点介绍了如何设置超像素尺寸、距离度量和迭代优化策略,适用于图像分割处理。
1万+

被折叠的 条评论
为什么被折叠?



