刚开始用这个函数很困惑,为什么生成的不是superpixel
% im contains the input RGB image as a SINGLE array regionSize = 10 ; regularizer = 10 ; segments = vl_slic(im, regionSize, regularizer) ;
按照教程使用后得到的是一个uint32的矩阵,相同的一个数的为一个superpixel
所以需要自己编程实现这个显示过程,参照 http://davidstutz.de/running-vlfeats-slic-superpixels-using-cmake-c/ 这里提供的C 代码
我写了一个Matlab 版本的函数
方法一:
function [ o ] = segment_slic( IMG )
%UNTITLED3 Summary of this function goes here
% Detailed explanation goes here
%IMG 为图片路径
%o 为输出图像
I = vl_rgb2xyz(imread(IMG));
I_single = single(I);
segments = vl_slic(I_single, 30, 0.1) ;
[m n] = size(segments);
for i=1:m
for j = 1:n
label = segments(i,j);
labelTop = label;
if i>1
labelTop = segments(i-1,j);
end
labelBottom = label;
if i<m-1
labelBottom = segments(i+1,j);
end
labelLeft = label;
if j > 1
labelLeft = segments(i,j - 1);
end
labelRight = label;
if j < n-1
labelRight = segments(i,j + 1);
end
if label ~= labelTop || label ~= labelBottom || label ~= labelLeft || label ~= labelRight
I(i,j,1)=0;
I(i,j,2)=0;
I(i,j,3)=0;
end
end
o = I;
end
end
实现效果:
方法二:
参看例子发现有更简便的方法:
求的是梯度。。。确实是好想法
function [ o ] = segment_slic( IMG ,SIZE,RATE)
%UNTITLED3 Summary of this function goes here
% Detailed explanation goes here
%IMG 为图片路径
%o 为输出图像
I = vl_rgb2xyz(imread(IMG));
II = (imread(IMG));
im=II;
I_single = single(I);
segments = vl_slic(I_single, SIZE, RATE) ;
[sx,sy]=vl_grad(double(segments), 'type', 'forward') ;
s = find(sx | sy) ;
imp = II ;
imp([s s+numel(im(:,:,1)) s+2*numel(im(:,:,1))]) = 0 ;
o = imp;
end