原图与分割结果

          

主程序:

clc;
clear all;
close all;
%用Superpixels算法对图像进行分割
I=imread('D:\Gray Files\lena.jpg');%提取各颜色分量
B = double(I(:,:,3));
G = double(I(:,:,2));
R = double(I(:,:,1));
%种子点数量
num_seeds=200;
%颜色与空间距离相关性
compactness=40;
%计算超像素
labels=SLIC(num_seeds,compactness,R,G,B);
%边界线检测
points=FindAroundLine(labels);
%将边界点设置为白色
while ~isempty(points)p=points(1,:);R(p(1),p(2))=255;G(p(1),p(2))=255;    B(p(1),p(2))=255;    points(1,:)=[];
end
I(:,:,1)=R;
I(:,:,2)=G;
I(:,:,3)=B;
imshow(I)
% imwrite(I,'D:\Gray Files\10-52-Superpixel.tif','tif');

超像素计算函数,SLIC如下:

%SLIC算法
%输入参数:
%I  为RGB图像
%numseeds  种子点数量
%compactness  颜色与空间距离相关性
function [labels]=SLIC(num_seeds,compactness,R,G,B)[M,N]=size(R);%图像总的像素数量n_tp=M*N;%步进的间隔,补0.5的误差step=floor(sqrt(n_tp/num_seeds)+0.5);    %计算种子点及数量[seeds,num_seeds]=GetSeeds(step,M,N,R,G,B);%计算超像素集合[seeds,labels]=SuperpixelSLIC(seeds,num_seeds,M,N,step,compactness,R,G,B);%强制类别连通k=floor(M*N/(step*step));labels=EnforceLabelConnectivity(labels,M,N,num_seeds,k);
end
%%调整图像的种子点
%输入参数:
%         step  步进间隔
%         M     图像的高度
%         N     图像的宽度
%         R     颜色R分量
%         G     颜色G分量
%         B     颜色B分量
function [seeds,num_seeds]=GetSeeds(step,M,N,R,G,B)%种子点集合,分别为R,G,B,x,yseeds=zeros(1,5);%注意,这里的x,y与实际相反%计算坐标误差xstrips=floor(M/step);ystrips=floor(N/step);%计算x坐标误差xerr=floor(M-step*xstrips);if xerr<0xstrips=xstrips-1;xerr=floor(M-step*xstrips);end%计算y坐标误差yerr=floor(N-step*ystrips);if yerr<0ystrips=ystrips-1;yerr=floor(N-step*ystrips);end    xerrperstrip=xerr/xstrips;yerrperstrip=yerr/ystrips;xoff=floor(step/2);yoff=floor(step/2);%种子点计数器n=1;%实际的种子点数量num_seeds=xstrips*ystrips;for x=0:xstrips-1xe=floor(x*xerrperstrip);for y=0:ystrips-1ye=floor(y*yerrperstrip);%种子点的y坐标seedy=floor(y*step+yoff+ye);%种子点的x坐标seedx=floor(x*step+xoff+xe);seeds(n,1)=R(seedx,seedy);seeds(n,2)=G(seedx,seedy);seeds(n,3)=B(seedx,seedy);seeds(n,4)=seedx;seeds(n,5)=seedy;n=n+1;endend
end
%计算超像素集合
function [seeds,labels]=SuperpixelSLIC(seeds,num_seeds,M,N,step,compactness,R,G,B)%每个像素的距离设定,正无穷大d=Inf(M,N);%图像像素点的类别矩阵labels=-1*ones(M,N);%偏移量offset=step;if step<8offset=step*1.5;endinvwt=1/(step/compactness)^2;%迭代计算中心种子点for itr=1:10for i=1:num_seeds%计算x的最小区间x_min=seeds(i,4)-offset;if x_min<1;x_min=1;end%计算x的最大区间x_max=seeds(i,4)+offset;if x_max>Mx_max=M;end%计算y的最小区间y_min=seeds(i,5)-offset;if y_min<1;y_min=1;end%计算y的最大区间y_max=seeds(i,5)+offset;if y_max>Ny_max=N;end   %计算2step*2step范围内的混合距离for x=x_min:x_maxfor y=y_min:y_max%这里计算平方,不开方,只是为了比较大小,节省计算开销d_color=(seeds(i,1)-R(x,y))^2+(seeds(i,2)-G(x,y))^2+(seeds(i,3)-B(x,y))^2;d_space=(seeds(i,4)-x)^2+(seeds(i,5)-y)^2;D=d_color+d_space*invwt;%更为精确的计算% D=sqrt(d_color)+sqrt(d_space*invwt);if D<d(x,y)d(x,y)=D;labels(x,y)=i;endendend%重新计算该种子点的中心点endend%创建新的种子点集合,分别为R,G,B,x,y,第6列为簇的大小new_seeds=zeros(num_seeds,6);for x=1:Mfor y=1:N%图像x,y所在位置的类别号label=labels(x,y);%将当前类别号在x,y点的R,G,B,x,y值进行累加new_seeds(label,1)=new_seeds(label,1)+R(x,y);new_seeds(label,2)=new_seeds(label,2)+G(x,y);new_seeds(label,3)=new_seeds(label,3)+B(x,y);new_seeds(label,4)=new_seeds(label,4)+x;    new_seeds(label,5)=new_seeds(label,5)+y;new_seeds(label,6)=new_seeds(label,6)+1;endend%计算新的种子点for i=1:num_seedsseeds(i,:)=new_seeds(i,1:5)/new_seeds(i,6);end
end
%强制类别连通
function [labels,numlabels]=EnforceLabelConnectivity(labels,M,N,num_seeds,k)%nlabels=-1*ones(M,N);numlabels=num_seeds;sz=M*N;supsz=floor(sz/k);label=1;
%     oindex=1;%邻接类别adjlabel=1;for x=1:Mfor y=1:Nif nlabels(x,y)<0%将点x,y类别号赋值nlabels(x,y)=label;%查找x,y周围是否有邻接类别if x-1>=1 && nlabels(x-1,y)>=1adjlabel=nlabels(x-1,y);elseif x+1<=M && nlabels(x+1,y)>=1adjlabel=nlabels(x+1,y);elseif y-1>=1 && nlabels(x,y-1)>=1adjlabel=nlabels(x,y-1);elseif y+1<=N && nlabels(x,y+1)>=1adjlabel=nlabels(x,y+1);end%查找所有与点x,y 4连通的点%连通点(簇)计数器count=1;%连通点堆栈points=[x,y];ps_back=[x,y];while ~isempty(points)%取出堆栈中第一个点,并以此为中心开始搜索类别相同的点p=points(1,:);%上点if p(1)-1>=1if nlabels(p(1)-1,p(2))<0 && labels(p(1)-1,p(2))==labels(x,y)points=cat(1,points,[p(1)-1,p(2)]);ps_back=cat(1,ps_back,[p(1)-1,p(2)]);nlabels(p(1)-1,p(2))=label;count=count+1;endend%下点if p(1)+1<=Mif nlabels(p(1)+1,p(2))<0 && labels(p(1)+1,p(2))==labels(x,y)points=cat(1,points,[p(1)+1,p(2)]);ps_back=cat(1,ps_back,[p(1)+1,p(2)]);nlabels(p(1)+1,p(2))=label;count=count+1;endend                    %左点if p(2)-1>=1if nlabels(p(1),p(2)-1)<0 && labels(p(1),p(2)-1)==labels(x,y)points=cat(1,points,[p(1),p(2)-1]);ps_back=cat(1,ps_back,[p(1),p(2)-1]);nlabels(p(1),p(2)-1)=label;count=count+1;endend%右点if p(2)+1<=Nif nlabels(p(1),p(2)+1)<0 && labels(p(1),p(2)+1)==labels(x,y)points=cat(1,points,[p(1),p(2)+1]);ps_back=cat(1,ps_back,[p(1),p(2)+1]);nlabels(p(1),p(2)+1)=label;count=count+1;endend  points(1,:)=[];end%如果簇的规模小于阈值,则将其合并到邻接类别中if count<=supsz/4while ~isempty(ps_back)p=ps_back(1,:);nlabels(p(1),p(2))=adjlabel;ps_back(1,:)=[];end%合并类别时,标号需要减1label=label-1;end%类别标签加1label=label+1;endendendnumlabels=label;labels=nlabels;
end

边界线检测函数,FindAroundLine如下:

%查找边界线
function [points]=FindAroundLine(labels)[M,N]=size(labels);%初始化边界点矩阵points=zeros(1,2);%八连通点dx=[-1, -1,  0,  1, 1, 1, 0, -1];dy=[0, -1, -1, -1, 0, 1, 1,  1];%计数器n=1;%寻找超像素的边界线,用八连通性来判断for x=1:Mfor y=1:N%周围点类别不同计数器np=0;for i=1:length(dx)xx=x+dx(i);yy=y+dy(i);if (xx>=1 && xx<=M) && (yy>=1 && yy<=N)if labels(xx,yy)~=labels(x,y)np=np+1;endendendif np>1points(n,:)=[x,y];n=n+1;endendend
end

图像分割——超像素(Superpixels)分割(Matlab)相关推荐

  1. SLIC与目前最优超像素算法的比较 SLIC Superpixels Compared to State-of-the-art Superpixel Methods

    SLIC与目前最优超像素算法的比较 Radhakrishna Achanta, Appu Shaji, Kevin Smith, Aurelien Lucchi, Pascal Fua, and Sa ...

  2. SLIC与目前最优超像素算法的比较

    SLIC与目前最优超像素算法的比较 Radhakrishna Achanta, Appu Shaji, Kevin Smith, Aurelien Lucchi, Pascal Fua, and Sa ...

  3. 使用OpenCV和Python标记超像素色彩

    本文翻译自光头哥哥的博客: [Labeling superpixel colorfulness with OpenCV and Python],仅做学习分享. 原文链接: https://www.py ...

  4. 图像分割:Python的SLIC超像素分割

    图像分割:Python的SLIC超像素分割 1. 什么是超像素? 2. 为什么超像素在计算机视觉方面有重要的作用? 3. 简单线性迭代聚类(SLIC) 4. 效果图 5. 源码 参考 1. 什么是超像 ...

  5. MATLAB显示slic,quickshift超像素分割结果图

    首先介绍vlfeat库函数:vl_slic,vl_quickshift,vl_quckseg vl_slic  SLIC superpixels segments = vl_slic(im,regio ...

  6. 超像素、语义分割、实例分割、全景分割 傻傻分不清?

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 在计算机视觉中,图像分割是个非常重要且基础的研究方向.简单来说,图 ...

  7. VLFeat SLIC超像素分割(Cpp版)

    这段时间对VLFeat的C接口非常的感兴趣,以前用的都是其Matlab接口,虽然很方便,而且提供的Matlab接口要比C接口功能更强大,但Matlab终归只能用来做一下快速的方法验证,所以想比较完整的 ...

  8. SLIC 超像素分割详解(三):应用

    看过上面的介绍后,我们应该思考一下:分割好的超像素有什么用?怎么用?用到哪里? 首先,超像素可以用来做跟踪,可以参考卢湖川课题组发表在IEEE TIP上的<Robust superpixeltr ...

  9. SLIC超像素分割的算法介绍和源码分析

    前述 最近在看显著性检测,发现很多算法的基础是超像素分割,而正在看的Saliency Optimization from Robust Background Detection算法的预处理是SLIC算 ...

  10. SLIC超像素分割详解

    SLIC超像素分割详解(一) 超像素概念是2003年Xiaofeng Ren提出和发展起来的图像分割技术,是指具有相似纹理.颜色.亮度等特征的相邻像素构成的有一定视觉意义的不规则像素块.它利用像素之间 ...

最新文章

  1. 在Java中使用final关键字可以提高性能吗?
  2. jedis操作set_redis命令行操作set集合和java方式操作set集合
  3. 关于双WiFi板卡做路由功能的记录
  4. VMware下主机与虚拟机剪切板独立,无法直接复制粘贴
  5. 【新年礼物】阿里资深p8教你学习Web全栈架构师!
  6. 计算Python运行时间
  7. android box2d小程序
  8. homebrew mac_借助Homebrew使从Mac到Linux的转换更加容易
  9. 当包装类的要与基本类型进行比较时候 需要先将包装类降级为基本类型
  10. iQOO 8首次采用三星E5屏幕:2021年最好的手机屏幕
  11. 字符串常量与字符数组的区别和字符串常量易错点
  12. java.io.FileNotFoundException: ...\ibs\library-1.0.17.jar (系统找不到指定的文件。)
  13. MAC 下开发 不区分大小写问题及解决
  14. 直销模式系统开发|双轨制度跟级差制度哪个模式比较好?
  15. SECS/GEM实现(一)半导体通讯协议软件,C、C++使用介绍
  16. 【项目记录/vue移动端】仿京东到家登录页
  17. Django和layim实现websocket
  18. VMware虚拟机安装kali linux 系统时黑屏,左上角光标一直闪
  19. BUUCTF-Web:[GXYCTF2019]Ping Ping Ping
  20. 读书感受 之 《菊与刀》

热门文章

  1. GitHub 优秀的 Android 开源项目和框架
  2. Github上优秀的开源项目
  3. win7 计算机定时关机脚本,win7定时关机命令是什么 如何设置定时关机【图解】...
  4. Vcpkg 的安装与使用
  5. fh 幅频特性曲线怎么画fl_测量rc带通滤波器的幅频特性和相频特性-电子科技大学.ppt...
  6. ISO/IEC 27000 信息安全管理体系认证培训及所有标准资料
  7. matlab仿真元件,matlab电力系统仿真元件[高等教育]
  8. 4. Podfile 的解析逻辑
  9. 区间直觉模糊集相似度及matlab应用
  10. Android Studio向SVN上传新项目