function klabels = PerformSuperpixelSLIC(img_Lab, kseedsl, kseedsa, kseedsb, kseedsx, kseedsy, STEP, compactness)
[m_height, m_width, m_channel] = size(img_Lab);
numseeds = size(kseedsl);
img_Lab = double(img_Lab);
%像素标签格式为(x, y) (行, 列)
klabels = zeros(m_height, m_width);
%聚类尺寸
clustersize = zeros(numseeds, 1);
inv = zeros(numseeds, 1);
sigmal = zeros(numseeds, 1);
sigmaa = zeros(numseeds, 1);
sigmab = zeros(numseeds, 1);
sigmax = zeros(numseeds, 1);
sigmay = zeros(numseeds, 1);
invwt = 1/((double(STEP)/double(compactness))*(double(STEP)/double(compactness)));
%invwt = double(compactness)/double(STEP);
distvec = 100000*ones(m_height, m_width);
numk = numseeds;
for itr = 1: 10 %迭代次数
sigmal = zeros(numseeds, 1);
sigmaa = zeros(numseeds, 1);
sigmab = zeros(numseeds, 1);
sigmax = zeros(numseeds, 1);
sigmay = zeros(numseeds, 1);
clustersize = zeros(numseeds, 1);
inv = zeros(numseeds, 1);
distvec = double(100000*ones(m_height, m_width));
%根据当前种子点信息计算每一个像素的归属
for n = 1: numk
y1 = max(1, kseedsy(n, 1)-STEP);
y2 = min(m_height, kseedsy(n, 1)+STEP);
x1 = max(1, kseedsx(n, 1)-STEP);
x2 = min(m_width, kseedsx(n, 1)+STEP);
%按像素计算距离
for y = y1: y2
for x = x1: x2
%dist_lab = abs(img_Lab(y, x, 1)-kseedsl(n))+abs(img_Lab(y, x, 2)-kseedsa(n))+abs(img_Lab(y, x, 3)-kseedsb(n));
dist_lab = (img_Lab(y, x, 1)-kseedsl(n, 1))^2+(img_Lab(y, x, 2)-kseedsa(n, 1))^2+(img_Lab(y, x, 3)-kseedsb(n, 1))^2;
dist_xy = (double(y)-kseedsy(n, 1))*(double(y)-kseedsy(n, 1)) + (double(x)-kseedsx(n, 1))*(double(x)-kseedsx(n, 1));
%dist_xy = abs(y-kseedsy(n)) + abs(x-kseedsx(n));
%距离 = lab色彩空间距离 + 空间距离权重×空间距离
dist = dist_lab + dist_xy*invwt;
%在周围最多四个种子点中找到最相似的 标记后存入klabels
%m = (y-1)*m_width+x;
if (dist<distvec(y, x))
distvec(y, x) = dist;
klabels(y, x) = n;
end
end
end
end
%重新计算种子点位置 使其向梯度最小地方移动
ind = 1;
for r = 1: m_height
for c = 1: m_width
sigmal(klabels(r, c),1) = sigmal(klabels(r, c),1)+img_Lab(r, c, 1);
sigmaa(klabels(r, c),1) = sigmaa(klabels(r, c),1)+img_Lab(r, c, 2);
sigmab(klabels(r, c),1) = sigmab(klabels(r, c),1)+img_Lab(r, c, 3);
sigmax(klabels(r, c),1) = sigmax(klabels(r, c),1)+c;
sigmay(klabels(r, c),1) = sigmay(klabels(r, c),1)+r;
clustersize(klabels(r, c),1) = clustersize(klabels(r, c),1)+1;
end
end
for m = 1: numseeds
if (clustersize(m, 1)<=0)
clustersize(m, 1) = 1;
end
inv(m, 1) = 1/clustersize(m, 1);
end
for m = 1: numseeds
kseedsl(m, 1) = sigmal(m, 1)*inv(m, 1);
kseedsa(m, 1) = sigmaa(m, 1)*inv(m, 1);
kseedsb(m, 1) = sigmab(m, 1)*inv(m, 1);
kseedsx(m, 1) = sigmax(m, 1)*inv(m, 1);
kseedsy(m, 1) = sigmay(m, 1)*inv(m, 1);
end
end
end
没有合适的资源?快使用搜索试试~ 我知道了~
matlab 超像素分割代码
共6个文件
m:6个
4星 · 超过85%的资源 需积分: 49 157 下载量 186 浏览量
2017-09-24
21:20:18
上传
评论 4
收藏 4KB RAR 举报
温馨提示
超像素分割代码 超像素概念是2003年Xiaofeng Ren提出和发展起来的图像分割技术,是指具有相似纹理、颜色、亮度等特征的相邻像素构成的有一定视觉意义的不规则像素块。它利用像素之间特征的相似性将像素分组,用少量的超像素代替大量的像素来表达图片特征,很大程度上降低了图像后处理的复杂度,所以通常作为分割算法的预处理步骤。已经广泛用于图像分割、姿势估计、目标跟踪、目标识别等计算机视觉应用。
资源推荐
资源详情
资源评论
收起资源包目录
SuperPixel.rar (6个子文件)
SuperPixel
EnforceLabelConnectivity.m 2KB
PerformSuperpixelSLIC.m 3KB
DrawContoursAroundSegments.m 684B
DetectLabEdge.m 1004B
SLIC_main.m 2KB
DrawContoursAroundSegments_EX.m 740B
共 6 条
- 1
资源评论
- qq_393559712019-05-22同是错误使用 zeros Size 输入必须为标量。 请问怎么解决
- Miku_master2017-12-26matlab程序,但是并没有运行成功,出现错误:Error using zeros:Size inputs must be scalar. Error in PerformSuperpixelSLIC (line 9) clustersize = zeros(numseeds, 1); Error in SLIC_main (line 45) klabels = PerformSuperpixelSLIC(img_Lab, kseedsl, kseedsa, kseedsb, kseedsx, kseedsy,STEP, m_compactness);
- A10368574132018-11-05测试过,不成功啊
qq_21397455
- 粉丝: 5
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功