图像分割——超像素(Superpixels)分割(Matlab)
原图与分割结果
主程序:
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)相关推荐
- SLIC与目前最优超像素算法的比较 SLIC Superpixels Compared to State-of-the-art Superpixel Methods
SLIC与目前最优超像素算法的比较 Radhakrishna Achanta, Appu Shaji, Kevin Smith, Aurelien Lucchi, Pascal Fua, and Sa ...
- SLIC与目前最优超像素算法的比较
SLIC与目前最优超像素算法的比较 Radhakrishna Achanta, Appu Shaji, Kevin Smith, Aurelien Lucchi, Pascal Fua, and Sa ...
- 使用OpenCV和Python标记超像素色彩
本文翻译自光头哥哥的博客: [Labeling superpixel colorfulness with OpenCV and Python],仅做学习分享. 原文链接: https://www.py ...
- 图像分割:Python的SLIC超像素分割
图像分割:Python的SLIC超像素分割 1. 什么是超像素? 2. 为什么超像素在计算机视觉方面有重要的作用? 3. 简单线性迭代聚类(SLIC) 4. 效果图 5. 源码 参考 1. 什么是超像 ...
- MATLAB显示slic,quickshift超像素分割结果图
首先介绍vlfeat库函数:vl_slic,vl_quickshift,vl_quckseg vl_slic SLIC superpixels segments = vl_slic(im,regio ...
- 超像素、语义分割、实例分割、全景分割 傻傻分不清?
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 在计算机视觉中,图像分割是个非常重要且基础的研究方向.简单来说,图 ...
- VLFeat SLIC超像素分割(Cpp版)
这段时间对VLFeat的C接口非常的感兴趣,以前用的都是其Matlab接口,虽然很方便,而且提供的Matlab接口要比C接口功能更强大,但Matlab终归只能用来做一下快速的方法验证,所以想比较完整的 ...
- SLIC 超像素分割详解(三):应用
看过上面的介绍后,我们应该思考一下:分割好的超像素有什么用?怎么用?用到哪里? 首先,超像素可以用来做跟踪,可以参考卢湖川课题组发表在IEEE TIP上的<Robust superpixeltr ...
- SLIC超像素分割的算法介绍和源码分析
前述 最近在看显著性检测,发现很多算法的基础是超像素分割,而正在看的Saliency Optimization from Robust Background Detection算法的预处理是SLIC算 ...
- SLIC超像素分割详解
SLIC超像素分割详解(一) 超像素概念是2003年Xiaofeng Ren提出和发展起来的图像分割技术,是指具有相似纹理.颜色.亮度等特征的相邻像素构成的有一定视觉意义的不规则像素块.它利用像素之间 ...
最新文章
- 在Java中使用final关键字可以提高性能吗?
- jedis操作set_redis命令行操作set集合和java方式操作set集合
- 关于双WiFi板卡做路由功能的记录
- VMware下主机与虚拟机剪切板独立,无法直接复制粘贴
- 【新年礼物】阿里资深p8教你学习Web全栈架构师!
- 计算Python运行时间
- android box2d小程序
- homebrew mac_借助Homebrew使从Mac到Linux的转换更加容易
- 当包装类的要与基本类型进行比较时候 需要先将包装类降级为基本类型
- iQOO 8首次采用三星E5屏幕:2021年最好的手机屏幕
- 字符串常量与字符数组的区别和字符串常量易错点
- java.io.FileNotFoundException: ...\ibs\library-1.0.17.jar (系统找不到指定的文件。)
- MAC 下开发 不区分大小写问题及解决
- 直销模式系统开发|双轨制度跟级差制度哪个模式比较好?
- SECS/GEM实现(一)半导体通讯协议软件,C、C++使用介绍
- 【项目记录/vue移动端】仿京东到家登录页
- Django和layim实现websocket
- VMware虚拟机安装kali linux 系统时黑屏,左上角光标一直闪
- BUUCTF-Web:[GXYCTF2019]Ping Ping Ping
- 读书感受 之 《菊与刀》
热门文章
- GitHub 优秀的 Android 开源项目和框架
- Github上优秀的开源项目
- win7 计算机定时关机脚本,win7定时关机命令是什么 如何设置定时关机【图解】...
- Vcpkg 的安装与使用
- fh 幅频特性曲线怎么画fl_测量rc带通滤波器的幅频特性和相频特性-电子科技大学.ppt...
- ISO/IEC 27000 信息安全管理体系认证培训及所有标准资料
- matlab仿真元件,matlab电力系统仿真元件[高等教育]
- 4. Podfile 的解析逻辑
- 区间直觉模糊集相似度及matlab应用
- Android Studio向SVN上传新项目