我有一篇关于超像素聚类的作业,我在这方面有一些困难。我被允许使用VLFeat库来查找超像素。

在找到超像素后,我为每个超像素定义特征向量;(超像素中所有像素的平均"R“值)(超像素中所有像素的平均"G”值)(超像素中所有像素的平均"B“值)(超像素中所有像素的平均”色调“值)(超像素中所有像素的平均”饱和度“值)(超像素中所有像素的平均”值“值)。
在此之后,我将特征向量和簇号发送到内置的kmeans函数中,以聚类为超级像素。
function [] = segmentIt (impath, clusNum)
%run vlfeat tools%
run ('vlfeat/toolbox/vl_setup');
%read input image%
image = imread (impath);
imDouble = im2double (image);
%save image W and H%
IH = size (image, 1);
IW = size (image, 2);
%convert input image to single%
imSingle = im2single (image);
%get superpixel data%
superPixels = vl_slic (imSingle, 80, 1);
%how many superpixel do we have?%
SPNUM = size (unique (superPixels), 1);
%changing color space for feature vector%
imHSV = rgb2hsv (image);
%create feature vector with [averageR averageG averageB averageH averageS averageV]%
FEATURE = zeros (SPNUM, 6);
for i=0:SPNUM-1
K = find (superPixels == i);
L = zeros (size(K,1), 2);
L(:,1) = ceil (K(:,1) ./ IW);
L(:,2) = mod(K(:,1), IW) + 1;
intensityTotalR = 0;
intensityTotalG = 0;
intensityTotalB = 0;
vTotal = 0;
sTotal = 0;
hTotal = 0;
for j = 1 : size (L, 1)
intensityTotalR = intensityTotalR + ( imDouble (L(j,1), L(j,2), 1));
intensityTotalG = intensityTotalG + ( imDouble (L(j,1), L(j,2), 2));
intensityTotalB = intensityTotalB + ( imDouble (L(j,1), L(j,2), 3));
vTotal = vTotal + imHSV (L(j,1), L(j,2), 3);
sTotal = sTotal + imHSV (L(j,1), L(j,2), 2);
hTotal = hTotal + imHSV (L(j,1), L(j,2), 1);
end
FEATURE(i+1,:) = [intensityTotalR/size(L,1) intensityTotalG/size(L,1) intensityTotalB/size(L,1) vTotal/size(L,1) sTotal/size(L,1) hTotal/size(L,1)];
end
RESULT = kmeans (FEATURE, clusNum);
newIMAGE = zeros(IH, IW, 3);
colorMultiplier = 1/(clusNum+5);
for i=1:clusNum
K = find (RESULT == i);
for j = 1: size (K,1)
L = find (superPixels == K(j,1));
S = zeros (size(L,1), 2);
S(:,1) = ceil (L(:,1) ./ IW);
S(:,2) = ceil (mod (L(:,1), IW)) + 1;
for z = 1:size(S,1)
newIMAGE (S(z,1), S(z,2), 1) = colorMultiplier * i;
newIMAGE (S(z,1), S(z,2), 2) = colorMultiplier * i;
newIMAGE (S(z,1), S(z,2), 3) = 1;
end
end
end
imshow (newIMAGE)
end在运行我的函数之后,结果的映像看起来不太好。知道我的代码中遗漏了什么吗?
结果图像:

编辑
好吧,这真的很奇怪。我回忆起我的超像素,这就是我得到的。

编辑-2
我根据lennon310的说法编辑了我的代码。还有沃拉。问题在于我使用find()函数的方式。
这就是当集群数等于5时的结果。

从现在开始,我将尝试升级我的特征向量,以获得更好的结果。谢谢lennon310
发布于 2014-01-08 21:37:31
密码在我看来不错。colorMultiplier * i作为一个小于1的值,imshow应该很好,但要与imagesc反复检查观察差异,虽然可能没有视觉上的差异。
不看你的形象,要指出原因是不容易的。如何定义聚类结果的“良好”?聚类方法对特征密度、大小和使用的度量非常敏感。我总是喜欢使用这幅图像来展示不同的聚类算法是如何导致激烈的分割结果的(不幸的是,在这个例子中没有k-均值)。可能你只需要尝试其他的方法,如果从k-均值分割远离你的期望。

编辑
如果您使用的是k-方法,也许您可以在完全实现之前减少该功能。例如,您可以只使用RGB空间特性,并通过在'Replicates'中设置一个较小的数目来减少迭代,在继续下一步之前观察分段结果。
给定超像素,你能恢复原始图像吗?如果是,您可以尝试通过RESULT方法查看reshape的图像。这可以在您最终在kmeans中设置值之前测试newIMAGE是否正常工作。
EDIT2
变化
K = find (superPixels == i);
L = zeros (size(K,1), 2);
L(:,1) = ceil (K(:,1) ./ IW);
L(:,2) = mod(K(:,1), IW) + 1;至
[K1,K2] = find (superPixels == i);
L = zeros (length(K1), 2);
L(:,1) = K1;
L(:,2) = K2;发布于 2015-08-08 13:10:46
希望这篇文章不会太晚引起你的兴趣。我有一些问题需要解决使用SLIC +分组。但我发现一些修改可能会带来更好的结果:
https://stackoverflow.com/questions/21006428
复制相似问题