首先介绍vlfeat库函数:vl_slic,vl_quickshift,vl_quckseg
vl_slic SLIC superpixels
- segments = vl_slic(im,regionsize,regularizer)
- segments:每个像素值是超像素标号
- regionsize:超像素的起始大小
- regularizer:用于聚类时控制超像素呈现的空间规则性,值越大超像素块越规则
- im:需要转为single类型
vl_quickshift Quick shift image segmentation
- [map,gaps] = vl_quickshift(im, kernelsize, maxdist)
- [map, gaps] = vl_quickshift(I, kernelsize)
- [map, gaps,e] = vl_quickshift(I, kernelsize, maxdist)
- kernelsize:估计density的Parzen window的bandwidth
- maxdist:控制所连接邻域的最大L2距离
- map和gaps代表结果forest的trees:map每个像素表示forest的parent元素,gaps包含对应的分支长度
vl_quickseg Produce a quickshift segmentation of a grayscale or color image
- vl_quickseg要调用vl_quickshift
- [iseg, labels, maps, gaps, e] = vl_quickseg (im, ratio, kernelsize, maxdist)
- iseg:color image。每个像素被其区域平均color标记
- labels:labeled image。标号为类别号
- maps:pointer。指向最近的增大其density估计值的像素
- gaps:distance。距最近的增大其density估计值的像素的距离
- e:density的估计值
- im:需要转换为double类型
- kernelsize:标准差
- maxdist:tree nodes之间的最大距离。用于cut links in the tree to 构成分割结果
- ratio:空间一致性和颜色一致性之间的比率。ratio越小空间比重越大,空间距离在归一化之前计算。类似vl_slic参数regularizer,不过ratio越小超像素块越规则
对于vl_slic得到的segments或者labels,可以有以下两种方式显示超像素分割结果
1、以颜色标记形式显示:imagesc();
imagesc(SEGMENTS); %Scale data and display image object
axis equal off tight; %关闭坐标
colormap gray; %以灰度图形式显示
2、显示超像素边界:vl_grad()求梯度,“|”逻辑或——找边界
[sx,sy]=vl_grad(double(SEGMENTS), 'type', 'forward') ; %求梯度
s = find(sx | sy) ; % or - Find logical OR
imp = im ;
imp([s s+numel(im(:,:,1)) s+2*numel(im(:,:,1))]) = 255 ; %边界置为白色
imshow(imp);
颜色形式。
边界形式。
%完整代码
im=imread('CASE1.bmp');
REGIONSIZE=25;
REGULARIZER=0.05;
[m,n,c]=size(im);
if(c==1)
im=cat(3,im,im,im);
end
I = vl_rgb2xyz(im);
I_single = single(I);
SEGMENTS = vl_slic(I_single, REGIONSIZE, REGULARIZER);
imagesc(SEGMENTS);
axis equal off tight;
colormap gray;
[sx,sy]=vl_grad(double(SEGMENTS), 'type', 'forward') ;
s = find(sx | sy) ;
imp = im ;
imp([s s+numel(im(:,:,1)) s+2*numel(im(:,:,1))]) = 255 ;
figure;imshow(imp);