3 votes

K means clustering et Matlab

Je dois utiliser le kmeans sur une image rgb. Chaque élément de l'algorithme doit avoir 3 dimensions, une pour chaque canal de l'image. Le nombre d'éléments sera le nombre total de pixels de l'image. Je dois utiliser kmeans sur le cluster #5.

C'est donc ce que j'ai essayé :

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

kmeans(red,5)

Je ne sais pas si je le fais correctement ou non. J'ai cette erreur :

??? 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)

Quelqu'un peut-il me donner un coup de main ? Merci

5voto

John Points 1978

Votre exception, est due au fait que kmeans attend des données de type double (ainsi l'appel à double dans la deuxième ligne ci-dessous). Mais vous avez un problème supplémentaire, dans la mesure où vous ne passez pas les bonnes données dans kmeans. Vous devez créer une seule matrice numpixels x 3. reshape est votre ami pour ce genre de choses. Voici un exemple. Bonne chance.

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)));

1voto

ypnos Points 21940

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

0voto

Nassir Points 1
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,[])

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X