K表示聚类和Matlab

时间:2011-11-04 20:12:38

标签: matlab image-segmentation

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

所以这就是我的尝试:

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)

任何人都可以帮我一把吗?感谢

3 个答案:

答案 0 :(得分:5)

您的例外情况是由于kmeans期望数据类型为double(因此在下面第二行中调用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)));

答案 1 :(得分:1)

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

答案 2 :(得分: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,[])