3

我需要kmeans在 rgb 图像上使用该功能。算法的每个元素都需要有 3 个维度,一个用于图像的每个通道。元素的数量将是图像的像素总数。我需要kmeans在集群 #5 上使用。

所以这就是我尝试的:

img = imread('mypic.jpg');
red = img(:,:,1);
green = img(:,:,2);
blue = img(:,:,3);

kmeans(red,5)


我不知道我做的对不对。我有这个错误:

??? Error using ==> plus
Integers can only be combined with integers of the same class, or scalar doubles.

Error in ==> kmeans>distfun at 704
            D(:,i) = D(:,i) + (X(:,j) - C(i,j)).^2;

Error in ==> kmeans at 313
    D = distfun(X, C, distance, 0);

Error in ==> mysegmentation at 9
kmeans(R,2)

谁能帮我一把?谢谢

4

3 回答 3

5

您的例外是由于期望数据类型为 double 的事实kmeans(因此在double下面的第二行中调用)。但是您还有一个额外的问题,因为您没有将正确的数据传递给 kmeans。您需要创建一个 numpixels x 3 矩阵。 reshape是你的朋友。这是一个例子。祝你好运。

img = imread('mypic.jpg');
flatImg = double(reshape(img,size(img,1)*size(img,2),size(img,3)));
idx = kmeans(flatImg,5);
imagesc(reshape(idx,size(img,1),size(img,2)));
于 2011-11-04T21:18:00.537 回答
1

尝试img = double(imread('mypic.jpg'))/255.;

于 2011-11-04T20:20:24.267 回答
0
I1= imread('d:\flowers.jpg');
I2=rgb2gray(I1);

I=double(I2);
figure
subplot(1,3,1)
imshow(I1)
subplot(1,3,2)
imshow(I2)
g=kmeans(I(:),4);
J = reshape(g,size(I));
subplot(1,3,3)
imshow(J,[])
于 2013-02-01T19:52:43.997 回答