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
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
A voir également:
- K means
- Convertisseur k€ ✓ - Forum Audio
- Conversion de ke en euros - Forum Logiciels
- K-lite codec pack full - Télécharger - Conversion & Codecs
- (K) emoji ✓ - Forum Mail
- K meleon - Télécharger - Navigateurs
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 !
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 !
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
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
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
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
25 mars 2013 à 12:50
c mon encadreur qui m'a donné cette idée et j'ai essayé de faire le code..
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.
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.
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
13 avril 2013 à 23:53
merci :)