刚开始用这个函数很困惑,为什么生成的不是superpixel
% im contains the input RGB image as a SINGLE arrayregionSize = 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:mfor j = 1:nlabel = segments(i,j);labelTop = label;if i>1labelTop = segments(i-1,j);endlabelBottom = label;if i<m-1labelBottom = segments(i+1,j);endlabelLeft = label;if j > 1 labelLeft = segments(i,j - 1);endlabelRight = label;if j < n-1 labelRight = segments(i,j + 1);endif label ~= labelTop || label ~= labelBottom || label ~= labelLeft || label ~= labelRightI(i,j,1)=0;I(i,j,2)=0;I(i,j,3)=0;endendo = I;endend
实现效果:
方法二:
参看例子发现有更简便的方法:
求的是梯度。。。确实是好想法
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
如果觉得《vl_Feat---vl_slic的使用》对你有帮助,请点赞、收藏,并留下你的观点哦!