gpt4 book ai didi

matlab - 超像素聚类

转载 作者:太空宇宙 更新时间:2023-11-03 20:30:02 25 4
gpt4 key购买 nike

我有一个关于超像素聚类的家庭作业,我遇到了一些困难。我被允许使用 VLFeat 库来仅查找超像素。

The image I am processing:

找到超像素后,我为每个具有值的超像素定义了一个特征向量; [(超像素中所有像素的平均“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

运行我的函数后,生成的图像看起来不太好。知道我的代码中缺少什么吗?

结果图片:

Result Image

编辑

好吧,这真的很奇怪。我重新为我的超像素着色,这就是我得到的。

Result of recolouring of superpixels

EDIT-2

我根据 lennon310 所说的内容编辑了我的代码。哇哦。问题是我使用 find() 函数的方式。

这是簇数等于5时的结果。

enter image description here

从现在开始,我将尝试升级我的特征向量以获得更好的结果。谢谢 lennon310

最佳答案

我觉得代码不错。 colorMultiplier * i 作为小于 1 的值,imshow 应该没问题,但仔细检查 imagesc 以观察差异,尽管可能没有视觉差异。

不看你的形象,很难指出原因。您如何为聚类结果定义“好”?聚类方法对特征密度、大小和您使用的指标非常敏感。我总是喜欢用 this image展示不同的聚类算法如何导致剧烈的分割结果(不幸的是,示例中没有 k-means)。如果 k-means 的分割与您的预期相去甚远,您可能只需要尝试其他方法。

enter image description here

编辑

如果您使用的是 k-means,也许您可​​以在完全实现之前减少该功能。例如,您可以只使用 RGB 空间功能,并通过在 kmeans 中将 'Replicates' 设置为较小的数字来减少迭代次数,在继续下一步之前观察分割结果。

给定超像素,你能恢复原始图像吗?如果是,您可以尝试通过 reshape 方法查看 RESULT 的图像。这可以在您最终在 newIMAGE

中设置值之前测试 kmeans 是否正常工作

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;

关于matlab - 超像素聚类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21006428/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com