我在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);
我只是得到一个黑色图像,我无法看到带有超像素的分割图像。有没有办法可以查看网页中显示的结果?
答案 0 :(得分:4)
之所以如此,是因为segments
实际上是地图,它会告诉您图像的哪些区域是超像素。如果此地图中的像素属于ID k
,则表示此像素属于超像素k
。此外,地图的类型为uint32
,因此当您尝试执行imshow(segments);
时,它确实没有显示任何有意义的内容。对于在网站上看到的图像,给出您选择的参数有1023个段。因此,地图的范围为0到1023.如果想要查看段的外观,可以执行imshow(segments,[]);
。这将做的是ID为1023的区域将被映射为白色,而不属于任何超像素区域(ID为0)的像素将被映射为黑色。你实际上会得到这样的东西:
不是很有意义!现在,要获得您在网页上看到的内容,您将不得不做更多的工作。据我所知,VLFeat
没有内置功能,可以显示结果,就像在他们的网页上看到的那样。因此,您必须编写代码才能自己完成。您可以按照以下步骤执行此操作:
true
地图
k
:
true
的任何像素创建另一个标记为k
的地图,否则为false
。false
现在让我们来看看这段代码。以下是您已建立的设置:
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);
我们得到:
请记住,这不是完全与您在网站上获得的相同。我只是去了网站并保存了那张图片,然后继续我刚给你看的代码。这可能是因为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