一、算法步骤

1.将输入图像转化为CEILAB空间

2.输入k并计算出S:

3.创造一个以s为间距的网格

4.移动边缘的平均值

5.对图像中的每个像素在2s的邻域内进行搜索,并将该平均值分配给该像素

6.取分配给一个平均数的像素的样本平均数,并更新平均数的位置

7.转到第5步,重复一定数量的迭代次数

二、代码部分

% Written by Pratik Jain
% Subscribe me on YouTube
% https://www.youtube.com/PratikJainTutorialsclc
clear
close all
tic

1.输入图像并转化为CEILAB空间

%% Read Input Image and convert to CieLAB Space[file,path] = uigetfile('*.*');  /*选择文件*/
f = fullfile(path,file);/*输入路径,文件*/
a = imread(f);/*合并两个参数*/
a_lab = rgb2lab(a);

​ 参数:

2.输入k并计算出S

(1) 设置m、迭代次数n、超像素数量k、总像素数量N、距离s

%% Parametersm = 15;
n = 5;     %threshold on no. of iterations:迭代次数
k = 1000;

​ 参数:m:距离公式里的m:

​ n:迭代次数;k:超像素数量

%%
N = size(a,1)*size(a,2);%行数×列数s = sqrt(N/k);

​ 参数:N:像素;s:距离

(2) 设置梯度

%% Gradient Image
G = zeros(size(a,1)-1,size(a,2)-1);
for i = 2:size(a,1)-1for j = 2:size(a,2)-1gx = (squeeze(a_lab(i+1,j,:))-squeeze(a_lab(i-1,j,:)));gy = (squeeze(a_lab(i,j+1,:))-squeeze(a_lab(i,j-1,:)));G(i,j) = gx(1)^2 + gx(2)^2 + gx(3)^2 + gy(1)^2 + gy(2)^2 + gy(3)^2;end
end
% figure;
% imagesc(G);

​ 梯度公式:

3.创造一个以s为间距的网格

(1) 初始化聚类中心

​ 为了避免影响后续的聚类结果,种子点在邻域内的窗口内移动,同时计算所有像素点的梯度值,并且保证移动到梯度值最小的位置上,防止种子点被分配到影像的边缘位置或噪声点的位置。并且分配标签到每个种子点上。

%% Initializing the Centers
s = ceil(s); %四舍五入
cx = s:s:size(a,1)-s;  %x网格;  size函数:获取矩阵的行数和列数
cy = s:s:size(a,2)-s;  %y网格
p=1;
for i = 1:size(cx,2)for j = 1:size(cy,2)loc(p,:) = [cx(i),cy(j)];  %loc里面存着坐标;loc函数是利用index的名字,来获取想要的行或列p=p+1;end
end  %循环后生成了网格for i = 1:size(loc,1)c(i,:) = [a_lab(loc(i,1),loc(i,2),1) a_lab(loc(i,1),loc(i,2),2) a_lab(loc(i,1),loc(i,2),3) loc(i,1) loc(i,2)];  %5个参数分别代表着red green blue x y
end

运行结果:

​ 参数loc

​ 参数c:每一行都代表一个像素

(2)生成网格

%% SLIC Algorithm
win = 7;
n1 = floor(win/2);
%%在7x7的窗口中搜索,将把聚类中心移到最小梯度的地方
lochange = -n1:n1;%lochange告诉坐标将在哪里转移%%此循环是为了把每一个聚类中心移动到最小梯度的地方
for i = 1:size(loc,1)H = G(loc(i,1)-n1:loc(i,1)+n1,loc(i,2)-n1:loc(i,2)+n1);%7X7的网格[a1,b1] = min(H);%a1:H中每一列的最小值;b1:最小值所在的行数[a2,b2] = min(a1);loc(i,1) = loc(i,1) + lochange(b1(b2));loc(i,2) = loc(i,2) + lochange(b2);  %控制像素从一个位置到另一个位置c(i,:) = [a_lab(loc(i,1),loc(i,2),1) a_lab(loc(i,1),loc(i,2),2) a_lab(loc(i,1),loc(i,2),3) loc(i,1) loc(i,2)];%%把值放到c中,网格创建完成
end

理解:聚类中心就是每一个红点,我们要做的就是把每一个聚类中心都移动到梯度最小的地方

运行结果:

​ lochange: 表示坐标将在 -3,-2,-1,0,1,2,3处转移

H: 7X7的网格

a1: H中每一列的最小值

b1:最小值所在的行数

c:移动聚类中心后的像素值

(3)设置进度条

msg = 'Segmenting ...';
x = 0;%x代表进度
f = waitbar(x,msg);

4.对图像中的每个像素在2s的邻域内进行搜索,并将该平均值分配给该像素

​ 相似性度量:对每个像素进行搜索,计算像素点与种子点之间的相似程度,包括颜色距离和空间距离,不断迭代直到收敛

参数设置会影响到超像素分割的结果

(1)在2s邻域内进行搜索,并将平均值分给该像素

while iter < nfor i2 = 1:size(a,1)    %%算距离,用公式for j2 = 1:size(a,2)dis = [];for k2 = 1:size(loc,1)if sqrt((i2-loc(k2,1))^2 + (j2 - loc(k2,2))^2) < 2*sd = sqrt((a_lab(i2,j2,1)-c(k2,1))^2 + (a_lab(i2,j2,2)-c(k2,2))^2 + (a_lab(i2,j2,3)-c(k2,3))^2) + m/s*sqrt((i2-c(k2,4))^2 + (j2-c(k2,5))^2);dis = [dis;d k2];%% 参数 dis:有多少平均值接近;d:实际距离;k2:它接近于哪一个平均值endendif isempty(dis) %如果是处于边界的像素,有时距离为0,这时什么也不运行else %如果不是空的[mind,I] = min(dis(:,1)); %提取最小值o(i2,j2) = dis(I,2); %通过dis命令得到k2;把平均值分给每个像素endendend

距离公式:

(2)像k-means算法一样更新平均数位置

在此循环中所有的主要位置都得到更新

 for i3 = 1:size(loc,1)[row,col] = find(o==i3);  %得到了行和列的索引;有多少像素在这个平均数上if isempty(row) && isempty(col)elserowmean = round(mean(row));  %行更新平均值colmean = round(mean(col));  %列更新平均值c(i3,:)=[a_lab(rowmean,colmean,1) a_lab(rowmean,colmean,2) a_lab(rowmean,colmean,3) rowmean colmean];  endend

(3)每次迭代都输出一次图像

%% Uncomment Following lines to see the image at every stepfor i4 = 1:size(a,1)for j4 = 1:size(a,2)for k4 = 1:3if o(i4,j4)~=0out(i4,j4,k4) = c(o(i4,j4),k4);endendendend
%%   out1 = lab2rgb(out)*255;figure;imshow(uint8(out1));
%%outvid(:,:,:,iter) = uint8(out1);

(4)迭代并输出图像

%%
for i4 = 1:size(a,1)  %i4代表每一次迭代for j4 = 1:size(a,2)for k4 = 1:3if o(i4,j4)~=0out(i4,j4,k4) = c(o(i4,j4),k4);endendend
end
%
% cform = makecform('lab2srgb');
% out1 = applycform(out,cform);
out1 = lab2rgb(out)*255;
imshow(uint8(out1));  %转换图片输出

5.给图像加边缘线

%% Edges on the image
d = double(edge((rgb2gray(uint8(out1))),'canny'));
d(find(d==1)) = 255;
d(find(d==0)) = 1;
d(find(d==255)) = 0;
f1 = out1.*d;
figure;
imshow(uint8(f1))

,cform);
out1 = lab2rgb(out)*255;
imshow(uint8(out1)); %转换图片输出

## 5.给图像加边缘线```matlab
%% Edges on the image
d = double(edge((rgb2gray(uint8(out1))),'canny'));
d(find(d==1)) = 255;
d(find(d==0)) = 1;
d(find(d==255)) = 0;
f1 = out1.*d;
figure;
imshow(uint8(f1))

SLIC超像素算法学习笔记相关推荐

  1. 【youcans 的 OpenCV 例程200篇】172.SLIC 超像素区域分割算法比较

    OpenCV 例程200篇 总目录-202205更新 [youcans 的 OpenCV 例程200篇]172.SLIC 超像素区域分割算法比较 5. 区域分割之聚类方法 5.3 SLIC 超像素区域 ...

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

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

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

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

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

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

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

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

  6. 波束形成算法学习笔记之一(Endfire,broadside)

    波束形成算法学习笔记 Broadside 结构 特点 空间响应(频率变化) 频率响应(角度变化) Endfire结构 特点 空间响应(频率变化) 空间响应(延迟变化) 频率响应(角度变化) 总结 麦克 ...

  7. 基于MVS的三维重建算法学习笔记(二)— 立体视觉的几何基础总结

    基于MVS的三维重建算法学习笔记(二)- 立体视觉的几何基础总结 声明 概述 1. 常见三维数据类型 2. 三维形状的几种表达形式 3. 三维空间刚体运动 4. 李群和李代数 5. 相机标定 6. 非 ...

  8. LMS与RLS算法学习笔记

    LMS与RLS算法学习笔记 一. 研究目的 1.1最陡下降法理论 1.2$LMS$算法 1.3$RLS$算法 1.4研究目标 二.代码解析 三.结果 实现代码点击 这里下载 一. 研究目的 1.1最陡 ...

  9. 基于MVS的三维重建算法学习笔记(一)— MVS三维重建概述与OpenMVS开源框架配置

    基于MVS的三维重建算法学习笔记(一)- MVS三维重建概述与OpenMVS开源框架配置 声明 1. MVS(Multi-view stereo)概述 稀疏重建与稠密重建的区别 稀疏重建--SFM(S ...

  10. 基于MVS的三维重建算法学习笔记(五)— 立体匹配经典算法PatchMatch论文翻译及要点解读

    基于MVS的三维重建算法学习笔记(五)- 立体匹配经典算法PatchMatch论文翻译及要点解读 声明 问题提出 问题建模 通过PatchMatch获取平面参数--Inference via Patc ...

最新文章

  1. 【ACM】杭电OJ 2018
  2. python的class的__str__()和__repr__()函数
  3. IB网络用户数量超过私有网络近4倍
  4. java系统架构图设计,先收藏了
  5. java set 取第一个_set集合取第一个元素的几种方法
  6. linux命令学习记录一
  7. ue4缓存位置怎么改_怎么从蓝图节点跳转到C++源码?
  8. 在线教育雪崩:藏在家长群里的“水军”消失了
  9. EC-JET喷码机报EC2.01偏转板电压故障
  10. python图像风格迁移_Python 超简单实现9种图像风格迁移
  11. 史上最强的融资方案商业计划书
  12. 裸机服务器装系统步骤,组装裸机如何装系统?
  13. ReentrantReadWriteLock、StampedLock读写锁
  14. 怎样从旧版本激活TeamViewer新版本界面?
  15. EXCEL中对一列数据每隔n行提取数据出来
  16. 加密技术和PKI系统
  17. 打开谷歌自动翻译功能
  18. js 截取文件后缀名
  19. 人大信息分析是计算机专业吗,【考研经验分享】——中国人民大学信息分析专业...
  20. WebBrowser 设置IE兼容性

热门文章

  1. 计算机控制系统编程语言有哪些,PLC编程语言有哪些种类
  2. 射频功放学习之ADS原理图版图联合仿真
  3. 浙江计算机二级word试题,浙江省计算机二级高级办公软件word试题
  4. 安徽省计算机二级水平考试试卷,安徽省计算机二级考试理论试题(附答案)
  5. JavaScript设计模式----装饰者模式
  6. android封装全局调用的toast_安卓全局toast
  7. Hook技术(1):Hook技术简介
  8. aac怎么转化为mp3格式?
  9. 冒险岛2服务器位置,《冒险岛2》二测造梦测试服务器开放公告
  10. 学习笔记之极客时间《Java 核心技术面试精讲》