K means

Résolu/Fermé
maryemgh Messages postés 8 Date d'inscription mercredi 27 février 2013 Statut Membre Dernière intervention 13 avril 2013 - 27 févr. 2013 à 15:01
maryemgh Messages postés 8 Date d'inscription mercredi 27 février 2013 Statut Membre Dernière intervention 13 avril 2013 - 13 avril 2013 à 23:53
Bonjour,

s'il vous plait..j'ai besoin d'une implémentation de cette fonction(k means) sous matlab pour une image au niveau de gris..j'ai un projet de fin d'étude et j'aime bien avoir ce code..j'ai compris le principe de cette fonction mais j'ai trouvé quelque difficulté au niveau de programmation:

--comment choisir les centres des classes!!
--comment on calcule les centres des classes!!
--est-ce qu'on a besoin de faire l'histogramme de l'image ou il le faut rendre sa matrice en un vecteur!!!

j'attend votre réponse..aidez moi s'il vous plait


A voir également:

3 réponses

Bonjour,

C'est quoi que tu dois faire exactement ? Faire des classes correspondant aux niveaux de gris de ton image ?

Dans ce cas, tu peux en premier faire l'histogramme de ton image. Tu devrais voir des zones denses ressortir. Ensuite, tu peux initialiser le centre de tes classes sur ces zones denses.
Par exemple, mettons que tu as une échelle de 100 niveaux de gris et que tu vois apparaître sur ton histogramme 3 zones plus denses autour des valeurs de niveaux de gris 10, 60 et 80. Tu vas initialiser 3 classes k1, k2 et k3 dont les moyennes respectives seront m1 = 10, m2 = 60 et m3 = 80.

Pour le calcul du centre des classes :
- tu prend chaque point I de ton image et tu l'assigne à la classe la plus proche : I appartient à kj tel que dist(I-mj) = min(sur p) dist(I-mp).
- une fois que tu as assigné tous les points à une classe, tu recalcules la moyenne de chaque classe.
- tu recommences les 2 étapes précédentes jusqu'à ce que m1, m2 et m3 ne bougent plus.

Voilà, j'espère que ça t'aura aidée !
0
maryemgh Messages postés 8 Date d'inscription mercredi 27 février 2013 Statut Membre Dernière intervention 13 avril 2013
25 mars 2013 à 12:48
voila c mon code mais il contient beaucoup d'erreur...
A=imread('C:\Users\gn\Desktop\hijab\283275_219466608099190_4621535_n.jpg');
N=input('entrer N');
d=rgb2gray(A);
subplot(1,2,1);
imshow(d);
[m,n]=size(d);
x=reshape(d,1,m*n);
F=length(x);
D=m*n/N;
out=D/2:D:m*n;
while(true)
Nout=out;
for i=1:N
v(i,:)=abs(x-out(i));
end
for i=1:F
S(i)=find(v(:,i)==min(v(:,i)));
end
for i=1:N
p=find(S==i);x(p);Nout=mean(x(p));
end
if(out==Nout)
break;end;
end
0
maryemgh Messages postés 8 Date d'inscription mercredi 27 février 2013 Statut Membre Dernière intervention 13 avril 2013
25 mars 2013 à 12:50
c mon encadreur qui m'a donné cette idée et j'ai essayé de faire le code..
0
N est le nombre de classes si je comprends bien ? Et out le centre des classes ?
A première vue, je suis d'accord avec tes boucles.

Par contre, à la ligne 12, je mettrais plutôt :
out=Nout;
sinon ça ne sert à rien : le but de l'algorithme est de modifier la valeur des centres des classes ! Quand tu as calculé tes nouveaux centres, c'est avec ces nouveaux centres que tu réitères l'algo. (Sinon, tu risques d'avoir une boucle infinie dans ton while.)
Et Nout=out; juste avant le while pour initialiser sans modifier les valeurs de départ.

Deuxième chose : si N et out sont bien ce que je penses, je ne comprends pas comment tu initialises ta variable out, car elle risque de prendre des valeurs supérieures à 255, chose impossible puisque x a des valeurs entre 0 et 255. Pour ma part, j'aurais fait quelque chose du genre :
out=linspace(0,255,N);

Pb quand tu calcules v : de base, x doit être de format uint8, et out en double. Du coup, abs(x-out(i)) = 0 chaque fois que out(i) > x. Donc avant ton while, il faudrait faire :
x = double(x);
pour convertir en double et autoriser que x-out(i) puisse être <0.

Pb quand tu calcules Nout dans la dernière boucle for : il faut mettre Nout(i), sans oublier l'indice, car c'est un vecteur...

Et là, quand ça s'arrête, Nout devrait donner les valeurs finales des classes.
0
Et à la limite, une fois l'algo fini, peut-être faire un Nout = uint8(Nout) pour revenir sur des valeurs de niveaux de gris.
0
maryemgh Messages postés 8 Date d'inscription mercredi 27 février 2013 Statut Membre Dernière intervention 13 avril 2013
13 avril 2013 à 23:53
merci :)
0