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