vl_Feat---vl_slic的使用

刚开始用这个函数很困惑,为什么生成的不是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

实现效果:

vl_Feat---vl_slic的使用_第1张图片



方法二:

参看例子发现有更简便的方法:

求的是梯度。。。确实是好想法

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




你可能感兴趣的:(matlab,vl_feat,vl_slic的使用)