基于Matlab的SLIC超像素分割算法分析

article/2025/10/1 8:19:16

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)
marker(i,j)=1;
end
end
end
I2=I;
for i=1:m
for j=1:n
if marker(i,j)==1
I2(i,j,:)=0;
end
end
end
figure,imshow(I2);
title(‘分割结果’)

SLIC.m文件
function Label=SLIC(img,s,errTh,wDs)
% 基于KMeans的超像素分割
% img为输入图像,维度不限,最大值为255
% s x s为超像素尺寸
% errTh为控制迭代结束的联合向量残差上限
m=size(img,1);
n=size(img,2);
%% 计算栅格顶点与中心的坐标
%图像长度与超像素尺寸比值向下取整
h=floor(m/s);
%图像宽度与超像素尺寸比值向下取整
w=floor(n/s);
rowR=floor((m-hs)/2); %多余部分首尾均分
colR=floor((n-w
s)/2);
rowStart=(rowR+1)😒:(m-s+1);
rowStart(1)=1;
rowEnd=rowStart+s;
rowEnd(1)=rowR+s;
rowEnd(end)=m;
colStart=(colR+1)😒:(n-s+1);
colStart(1)=1;
colEnd=colStart+s;
colEnd(1)=colR+s;
colEnd(end)=n;
rowC=floor((rowStart+rowEnd-1)/2);
colC=floor((colStart+colEnd-1)/2);
% 显示划分栅格结果
%先初始化temp为m*n的零矩阵
temp=zeros(m,n);
temp(rowStart,:)=1;
temp(:,colStart)=1;
for i=1:h
for j=1:w
temp(rowC(i),colC(j))=1;
end
end
figure,imshow(temp);
title(‘栅格划分结果’)
%保存栅格划分结果为栅格.jpg文件
imwrite(temp,‘栅格.jpg’);

%% 利用sobel算子和欧式距离计算梯度图像
img=double(img)/255;
%分别提取图像的三通道信息
r=img(:,:,1);
g=img(:,:,2);
b=img(:,:,3);
%采用加权法进行灰度化处理,权值分别为0.299 , 0.587,0.114
Y=0.299 * r + 0.587 * g + 0.114 * b;
f1=fspecial(‘sobel’);
f2=f1’;
gx=imfilter(Y,f1);
gy=imfilter(Y,f2);
G=sqrt(gx.2+gy.2);
%% 选择栅格中心点33邻域中梯度最小点作为起始点
rowC_std=repmat(rowC’,[1,w]);
colC_std=repmat(colC,[h,1]);
rowC=rowC_std;
colC=colC_std;
for i=1:h
for j=1:w
block=G(rowC(i,j)-1:rowC(i,j)+1,colC(i,j)-1:colC(i,j)+1);
[minVal,idxArr]=min(block(😃);
jOffset=floor((idxArr(1)+2)/3);
iOffset=idxArr(1)-3
(jOffset-1);
rowC(i,j)=rowC(i,j)+iOffset;
colC(i,j)=colC(i,j)+jOffset;
end
end

%% KMeans超像素分割
Label=zeros(m,n)-1;
dis=Infones(m,n);
M=reshape(img,m
n,size(img,3)); %像素值重排
% 联合色域值和空域值
colorC=zeros(h,w,size(img,3));
for i=1:h
for j=1:w
colorC(i,j,:)=img(rowC(i),colC(j)😅;
end
end
uniMat=cat(3,colorC,rowC,colC);
uniMat=reshape(uniMat,hw,size(img,3)+2);
iter=1;
while(1)
uniMat_old=uniMat;
% rowC_old=rowC;
% colC_old=colC;
for k=1:h
w
c=floor((k-1)/h)+1;
r=k-h*(c-1);
rowCidx=rowC(r,c);
colCidx=colC(r,c); %聚类中心坐标
%聚类限定的栅格(中心点始终是原s x s栅格的中心点)
rowStart=max(1,rowC_std(r,c)-s);
rowEnd=min(m,rowC_std(r,c)+s-1);
colStart=max(1,colC_std(r,c)-s);
colEnd=min(n,colC_std(r,c)+s);
% colorC=uniMat(k,1:size(img,3));
colorC=M((colCidx-1)*m+rowCidx,:);
for i=rowStart:rowEnd
for j=colStart:colEnd
colorCur=M((j-1)*m+i,:);
dc=norm(colorC-colorCur);
ds=norm([i-rowCidx,j-colCidx]);
d=dc2+wDs*(ds/s)2;
if d<dis(i,j)
dis(i,j)=d;
Label(i,j)=k;
end
end
end
end

%显示聚类结果
temp=mod(Label,20)+1;
figure;
imagesc(label2rgb(temp-1,'jet','w','shuffle')) ;
title('聚类结果')
axis image ; axis off ;F=getframe(gcf);
I=frame2im(F);
[I,map]=rgb2ind(I,256);
if iter == 1imwrite(I,map,'test.gif','gif','Loopcount',inf,'DelayTime',0.2);
elseimwrite(I,map,'test.gif','gif','WriteMode','append','DelayTime',0.2);
end
iter=iter+1;% 开始更新聚类中心
colorC=zeros(h,w,size(img,3));
for k=1:h*wnum=0;sumColor=zeros(1,size(img,3));    sumR=0;sumC=0;c=floor((k-1)/h)+1;r=k-h*(c-1);rowCidx=rowC_std(r,c);colCidx=colC_std(r,c);rowStart=max(1,rowCidx-s);rowEnd=min(m,rowCidx+s-1);colStart=max(1,colCidx-s);colEnd=min(n,colCidx+s);for row=rowStart:rowEndfor col=colStart:colEndif Label(row,col)==knum=num+1;sumR=sumR+row;sumC=sumC+col;color=reshape(img(row,col,:),1,size(img,3));sumColor=sumColor+color;endendendcolorC(r,c,:)=sumColor/num;rowC(r,c)=round(sumR/num);colC(r,c)=round(sumC/num);
end
uniMat=cat(3,colorC,rowC,colC);
uniMat=reshape(uniMat,h*w,size(img,3)+2);
diff=uniMat-uniMat_old;
diff(:,1:2)=sqrt(wDs)*diff(:,1:2)/s;
err=norm(diff)/sqrt(h*w);
if err<errTh %errTh是给定的阈值,残差低于阈值,结束迭代break;
end

end

%% 按照边界接触点数最多原则分配小连通域的标签
for k=1:hw
c=floor((k-1)/h)+1;
r=k-h
(c-1);
rowCidx=rowC_std(r,c);
colCidx=colC_std(r,c);
rowStart=max(1,rowCidx-s);
rowEnd=min(m,rowCidx+s-1);
colStart=max(1,colCidx-s);
colEnd=min(n,colCidx+s);
block=Label(rowStart:rowEnd,colStart:colEnd);
block(block~=k)=0;
block(block==k)=1;
label=bwlabel(block);
%标签个数最大值
szlabel=max(label(😃);
%block的高高
bh=rowEnd-rowStart+1;
%block的宽高
bw=colEnd-colStart+1;

if szlabel<2  %无伴生连通域,继续执行continue;
endlabelC=label(rowCidx-rowStart+1,colCidx-colStart+1); %主连通域的标记值
top=max(1,rowStart-1);
bottom=min(m,rowEnd+1);
left=max(1,colStart-1);
right=min(n,colEnd+1);
for i=1:szlabel %遍历连通域if i==labelC %主连通域不处理continue;endmarker=zeros(bottom-top+1,right-left+1); %生成一个外扩一圈的marker,标记哪些点已经被统计过接触情况bw=label;bw(bw~=i)=0;bw(bw==i)=1; %当前连通域标记图contourBW=bwperim(bw); %求取外轮廓idxArr=find(double(contourBW)==1);labelArr=zeros(4*length(idxArr),1);  %记录轮廓点的4邻域点标记值的向量num=0;for idx=1:size(idxArr) %遍历轮廓点,统计其4邻域点的标记值bc=floor((idxArr(idx)-1)/bh)+1;br=idxArr(idx)-bh*(bc-1); %轮廓点在block中的行列信息row=br+rowStart-1;col=bc+colStart-1; %轮廓点在大图中的行列信息rc=[row-1,col;...row+1,col;...row,col-1;...row,col+1];for p=1:4row=rc(p,1);col=rc(p,2);if ~(row>=1 && row<=m && col>=1 && col<=n && Label(row,col)~=k)continue;endif marker(row-top+1,col-left+1)==0 %未被统计过marker(row-top+1,col-left+1)=1;num=num+1;labelArr(num)=Label(row,col);endendendlabelArr(find(labelArr==0))=[]; %去除零元素uniqueLabel=unique(labelArr);numArr=zeros(length(uniqueLabel),1);for p=1:length(uniqueLabel)idx=find(labelArr==uniqueLabel(p));numArr(p)=length(idx);endidx=find(numArr==max(numArr));maxnumLabel=uniqueLabel(idx(1)); %接触最多的标签for row=rowStart:rowEndfor col=colStart:colEndif bw(row-rowStart+1,col-colStart+1)==0continue;endLabel(row,col)=maxnumLabel;endend
end

end

% 显示连通域处理后聚类结果
temp=mod(Label,20)+1;
figure;
imagesc(label2rgb(temp-1,‘jet’,‘w’,‘shuffle’)) ;
title(‘连通域处理后的聚类结果’)
axis image ; axis off ;

原始图像:
在这里插入图片描述
栅格划分结果:
在这里插入图片描述

聚类结果:
在这里插入图片描述
连通域处理后的聚类结果:
在这里插入图片描述
超像素分割结果:
在这里插入图片描述


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

相关文章

超像素分割算法————综述

参考&#xff1a;超像素—学习笔记 什么是超像素&#xff1f;评价标准&#xff1f;SLIC、SEED、ETPS算法 比较的指标&#xff1a;图像边界的粘附性、算法速度、存储效率、分割性能 超像素算法&#xff1a;将像素组合成感知有意义的原子区域( atomic regions)&#xff0c;其可…

超像素分割 SLIC算法 使用示例

参考博客 介绍超像素分割 & SLIC算法 SLIC超像素分割详解&#xff08;一&#xff09;&#xff1a;简介_计算机视觉life的博客-CSDN博客_slic超像素分割 机器学习&#xff1a;simple linear iterative clustering (SLIC) 算法_Matrix_11的博客-CSDN博客_简单线性迭代聚类…

图像处理: 超像素(superpixels)分割 SLIC算法

原理 超像素概念是2003年Xiaofeng Ren提出和发展起来的图像分割技术&#xff0c;是指具有相似纹理、颜色、亮度等特征的相邻像素构成的有一定视觉意义的不规则像素块。它利用像素之间特征的相似性将像素分组,用少量的超像素代替大量的像素来表达图片特征,很大程度上降低了图像…

超像素SLIC算法源码阅读

超像素SLIC算法源码阅读 超像素SLIC算法源码阅读SLIC简介源码阅读实验结果其他超像素算法对比 超像素SLIC算法源码阅读 SLIC简介 SLIC的全称Simple Linear Iterative Clustering&#xff0c;即简单线性迭代聚类&#xff0c;论文和代码链接如下&#xff1a; 论文传送门&#x…

python 超像素分割

SILC算法超像素分割&#xff08;源码实现&#xff09; 主体代码来自github.com/laixintao/slic-python-implementation 原代码中只有分割之后的小方块 即1.png 没有明显边界 没有继续进行图像分割 源码修改&#xff1a; 1.向Cluster类添加了label属性&#xff0c;以便于标记…

超像素分割学习笔记

学习目标 掌握超像素分割的原理、超像素分割方法的推导过程以及实现方法 1.1 超像素 超像素是指将具有相似纹理、颜色、亮度等特征的相邻像素聚合成某一个像素块&#xff0c;结合超像素的思想&#xff0c;这样可以使少量的像素块代替原本大量的像素。 目前超像素广泛应用于图…

SLIC超像素算法

原文出自&#xff1a;https://blog.csdn.net/Fighting_Dreamer/article/details/77170859 SLIC与目前最优超像素算法的比较 Radhakrishna Achanta, Appu Shaji, Kevin Smith, Aurelien Lucchi, Pascal Fua, and Sabine Susstrunk 摘要 近年来&#xff0c;计算机视觉应用越来…

超像素池化全监督语义分割

Efficient semantic image segmentation with superpixel pooling 摘要 在这项工作中&#xff0c;我们评估了超像素池化层在深层网络结构中用于语义分割的应用。超像素池化是一种灵活有效的方法&#xff0c;可以替代其他包含空z间先验信息的池策略。我们提出了一个简单而高效…

SLIC超像素分割算法

SLIC超像素分割算法 《SLIC Superpixels》 摘要 超像素在计算机视觉应用中越来越受欢迎。然而&#xff0c;很少有算法能够输出所需数量的规则、紧凑的超级像素&#xff0c;并且计算开销低。我们介绍了一种新的算法&#xff0c;将像素聚类在组合的五维颜色和图像平面空间中&a…

matlab 超像素合并,超像素区域合并

应广大学术同行的请求,将以往研究的一些代码进行整理,特发布一个学术版本的小软件工具:SuperpixelMerge, 基本功能:实现超像素的区域合并 参数说明:共7个参数,分别为图像路径、超像素分割标记图像路径、输出结果路径、合并准则、合并后区域个数、形状参数、紧凑度参数。详…

超像素—学习笔记

文章目录 概念超像素判别条件超像素初始化的方法超像素算法SLIC算法 参考资料 概念 超像素由一系列位置相邻且颜色、亮度、纹理等特征相似的像素点组成的小区域。这些小区域大多保留了进一步进行图像分割的有效信息&#xff0c;且一般不会破坏图像中物体的边界信息。 超像素是…

超像素采样网络(英伟达)

Superpixel Sampling Networks 摘要 超像素为图像数据提供了一种高效的低/中层次的表示&#xff0c;大大减少了后续视觉任务的图像基元数量。现有的超像素算法是不可微的&#xff0c;这使得它们很难集成到其他端到端可训练的深度神经网络中。我们开发了一种新的超像素采样可微…

超像素、语义分割、实例分割、全景分割

图像分割&#xff08;Image segmentation&#xff09;就是根据某些规则把图像中的像素分成不同的部分&#xff08;打上不同的标签&#xff09;。 1. 超像素&#xff08;superpixels&#xff09; 超像素并不是在普通的像素基础上继续像微观细分&#xff0c;恰恰相反的是&#…

超像素

《超像素》   超像素是一种以聚类思想为初衷的方法&#xff0c;目的是为了对较大像素的图像进行区域划分&#xff0c;来帮助理解&#xff0c;本文介绍了一个开源项目在火灾检测场景使用超像素&#xff0c;比较巧妙&#xff0c;虽然效果不是很理想&#xff0c;但是提供了一个…

超像素学习笔记(1)——概念及判别条件

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、超像素的概念二、超像素判别条件&#xff1a;一般参考三个指标1.Undersegmentation Error&#xff08;UE&#xff09;——欠分割误差2.Boundary Recall&…

超像素(superpixel)——SLIC和深度学习法

定义 可以理解成在图像上做的聚类问题。超像素的做法是将感知上相似的像素组在一起&#xff0c;称为一个超像素&#xff0c;以此来提供图像数据的紧凑表示。然后在后续的处理&#xff0c;处理单位就变成了超像素&#xff0c;而不是我们常用的像素。 一般超像素的结果可以为下…

学习笔记4:ubuntu常用命令

cd //打开路径cd.. //回到上一级目录cd &#xff5e; //回到主目录ls //列表touch demo.c //创建一个“demo.c”文件mkdir project //创建一个“project”文件夹vi . //进入当前目录删除文件 pwd //显示当前路径ifconfig //查看本机IP地址mv 文件名 /PATH //移动文件到某一目…

Ubuntu常用命令(持续更新)

Ubuntu常用命令&#xff08;持续更新&#xff09; 检查更新并升级切换至root账号修改root账号密码下载文件命令wget&#xff0c;举例&#xff1a;安装.deb文件&#xff08;在文件所在目录打开终端&#xff09;查看本机ip地址&#xff08;注意和windows系统的区别ipconfig&#…

Ubuntu常用命令 (超详细版)

1.切换到 root 用户 &#xff0c;输入 “sudo -i ”, 退出 “exit” pwd 显示当前目录&#xff0c; pwd print working directory ls 列出目录下当前文件 cp 复制文件/目录 cp (源文件或目录) (目标文件或目录) cp -r 复制文件夹 包括子目录和文件 r…

Ubuntu 常用命令大全——长期不定时更新

1. 系统相关 uname -a 显示当前系统相关信息sudo 临时获取超级用户权限su root 切换 root 用户sudo shutdown 关机sudo reboot 重启sudo nautilus 进入有 root 权限的文件管理器ps -A 查看当前有哪些进程kill 5 位进程号 结束进程 sudo fdisk -l 查看磁盘信息sudo mount /dev/…