VL_SLIC用于VL_FEAT的MATLAB输出

时间:2014-06-07 00:28:09

标签: matlab image-processing image-segmentation vlfeat

我在MATLAB中使用VL_SLIC函数,我在这里按照函数教程进行操作:http://www.vlfeat.org/overview/slic.html

这是我到目前为止编写的代码:

im = imread('slic_image.jpg');
regionSize = 10 ;
regularizer = 10;
vl_setup;
segments = vl_slic(single(im), regionSize, regularizer);
imshow(segments);

我只是得到一个黑色图像,我无法看到带有超像素的分割图像。有没有办法可以查看网页中显示的结果?

3 个答案:

答案 0 :(得分:4)

之所以如此,是因为segments实际上是地图,它会告诉您图像的哪些区域是超像素。如果此地图中的像素属于ID k,则表示此像素属于超像素k。此外,地图的类型为uint32,因此当您尝试执行imshow(segments);时,它确实没有显示任何有意义的内容。对于在网站上看到的图像,给出您选择的参数有1023个段。因此,地图的范围为0到1023.如果想要查看段的外观,可以执行imshow(segments,[]);。这将做的是ID为1023的区域将被映射为白色,而不属于任何超像素区域(ID为0)的像素将被映射为黑色。你实际上会得到这样的东西:

enter image description here

不是很有意义!现在,要获得您在网页上看到的内容,您将不得不做更多的工作。据我所知,VLFeat没有内置功能,可以显示结果,就像在他们的网页上看到的那样。因此,您必须编写代码才能自己完成。您可以按照以下步骤执行此操作:

  1. 创建与图片
  2. 大小相同的true地图
  3. 对于每个超像素区域k
    • 为属于区域true的任何像素创建另一个标记为k的地图,否则为false
    • 找到这个地区的周边。
    • 在步骤1中创建的地图中将这些周边像素设置为false
  4. 重复步骤#2,直到我们完成所有地区的通过。
  5. 使用此地图屏蔽原始图像中的所有像素,以获得您在网站上看到的内容。
  6. 现在让我们来看看这段代码。以下是您已建立的设置:

    vl_setup;
    im = imread('slic_image.jpg');
    regionSize = 10 ;
    regularizer = 10  ;
    segments = vl_slic(single(im), regionSize, regularizer);
    

    现在让我们来看看我刚才提到的算法:

    perim = true(size(im,1), size(im,2));
    for k = 1 : max(segments(:))
        regionK = segments == k;
        perimK = bwperim(regionK, 8);
        perim(perimK) = false;
    end
    
    perim = uint8(cat(3,perim,perim,perim));
    
    finalImage = im .* perim;
    imshow(finalImage);
    

    我们得到:

    enter image description here

    请记住,这不是完全与您在网站上获得的相同。我只是去了网站并保存了那张图片,然后继续我刚给你看的代码。这可能是因为slic_image.jpg图像不是他们示例中给出的确切原始图像。在存在一些不良量化伪像的区域中似乎存在超像素。另外,我使用的是相对较旧版本的VLFeat - 版本0.9.16。从那以后,算法可能有了改进,所以我可能没有使用最新版本。在任何情况下,这都是适合您的事情。

    希望这有帮助!

答案 1 :(得分:1)

我发现vl_demo_slic.m中的这些行可能很有用。

segments = vl_slic(im, regionSize, regularizer, 'verbose') ;

% overaly segmentation
[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))]) = 0 ;

它从超像素图(segments)的渐变生成边缘。

答案 2 :(得分:0)

虽然我想不带任何东西离开~rayryeng的〜美丽答案。 这也可能有所帮助。 http://www.vlfeat.org/matlab/demo/vl_demo_slic.html

适用于:toolbox / demo