IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MATLAB Discussion :

Problème de dimension (méthode Kmeans)


Sujet :

MATLAB

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 22
    Points : 13
    Points
    13
    Par défaut Problème de dimension (méthode Kmeans)
    Bonjour,

    J'ai un soucis lorsque j'utilise la méthode kmeans.

    Je récupère une matrice récoltant les composantes RVB de mon image via le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    %Taille: nombres de lignes, de colonnes, et de pixels de l'image
    taille=size(picture);
    nb_colonnes=taille(1,2);
     
     
    %Création des matrices unicolonnes Rouge, Vert et Bleu
    R=picture(:,1,1);
    V=picture(:,1,2);
    B=picture(:,1,3);
    for q=2:nb_colonnes
        R=[R;picture(:,q,1)];
        V=[V;picture(:,q,2)];
        B=[B;picture(:,q,3)];
    end
    %Création de la matrice RVB, 3 colonnes, une pour chaque composante
    %colorimétrique
    matriceRVB=[R,V,B];
    Une fois ceci fait je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CENTER = kmeans(matriceRVB,256)
    Afin de n'avoir à la fin seulement 256 couleurs.

    J'ai alors le problème suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    ??? Error using ==> plus
    Integers can only be combined with integers of the same class,
    or scalar doubles.
     
    Error in ==> kmeans>distfun at 722
                D(:,i) = D(:,i) + (X(:,j) - C(i,j)).^2;
     
    Error in ==> kmeans at 329
        D = distfun(X, C, distance, 0);
     
    Error in ==> utilisation_kmeans at 9
    CENTER = kmeans(matriceRVB,256)
     
    Error in ==> RunScript at 9
    utilisation_kmeans();
    Je suppose que je n'entre pas le bon format à la fonction, mais je ne sais pas comment régler le problème...

    Si quelqu'un a une idée, je suis preneur !

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Bonjour,

    Citation Envoyé par n4pkin Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    %Taille: nombres de lignes, de colonnes, et de pixels de l'image
    taille=size(picture);
    nb_colonnes=taille(1,2);
     
     
    %Création des matrices unicolonnes Rouge, Vert et Bleu
    R=picture(:,1,1);
    V=picture(:,1,2);
    B=picture(:,1,3);
    for q=2:nb_colonnes
        R=[R;picture(:,q,1)];
        V=[V;picture(:,q,2)];
        B=[B;picture(:,q,3)];
    end
    %Création de la matrice RVB, 3 colonnes, une pour chaque composante
    %colorimétrique
    matriceRVB=[R,V,B];
    s'écrit plus simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    matriceRVB = reshape(picture,size(picture,1)*size(picture,2),3);
    Pour ton erreur, il faut peut-être convertir les valeurs en double :
    CENTER = kmeans(double(matriceRVB),256);

    Par contre, comme dans ton autre post, que cherches-tu à faire? C'est de la segmentation? Si oui cette démo peut t'intéresser :
    Color-Based Segmentation Using K-Means Clustering

    Si non, pourquoi ne pas utiliser simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [image_indexee, map] = rgb2ind(picture,256);
    pour réduire le nombre de couleur?
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  3. #3
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par magelan Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    matriceRVB = reshape(picture,size(picture,1)*size(picture,2),3);
    Pour ton erreur, il faut peut-être convertir les valeurs en double :
    CENTER = kmeans(double(matriceRVB),256);
    Effectivement, c'est plus simple et mon problème est résolu. Merci

    Par contre, lorsque je lance la commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [X,CENTER] = kmeans(double(matriceRVB),Nombre);
    Avec Nombre petit je n'ai aucun problème.
    Par contre, quand Nombre s'approche de 100 ou plus, j'ai l'erreur suivante que je n'arrive pas à résoudre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     Error using ==> kmeans>batchUpdate at 435
    Empty cluster created at iteration 1.
     
    Error in ==> kmeans at 336
            converged = batchUpdate();
     
    Error in ==> utilisation_kmeans at 9
    [X,CENTER] = kmeans(double(matriceRVB),99);
     
    Error in ==> RunScript at 9
    utilisation_kmeans();
     
    Error in ==> Script_Main at 16
    RunScript();
    Quant à la méthode, je dois en fait réduire le nombre de couleurs de mon image à 256 via une méthode telle que K-means ou Fuzzy C-means :
    Je détermine des classes de couleurs à partir desquelles tous les pixels appartenant à cette classe se voient affecter la valeur du centre de la classe.
    Ce qui fait qu'à la fin je devrais faire :
    [X,CENTER] = kmeans(double(matriceRVB),256);

  4. #4
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Pour comprendre l'erreur, il faut comprendre un peu comment fonctionne les kmeans. Il y a 2 paramètres à prendre en compte en priorité (qui sont expliqués dans la doc) : la distance utilisée et l'initialisation des centres des clusters.
    Par défaut l'initialisation prends de façon aléatoire les centres parmi les données initiales. Il se peut donc qu'au au cours du processus certains clusters se retrouvent sans aucun autre élément que le centre du cluster ce qui provoque l'arrêt du programme avec l'erreur que tu as donné. Si tu relances le programme, il se peut que ça fonctionne, puisque les centres initiaux peuvent être différent à chaque fois.

    Mais de toute façon, vouloir faire 256 clusters, cela me semble énorme, surtout que pour ton image de base que tu as montré dans ton autre post, je l'avais regardé, et je ne suis même pas sur qu'elle possède beaucoup plus que 256 couleurs. Donc ce n''est pas étonnant que certains clusters soient vide lorsque tu augmentes le nombre de clusters.
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  5. #5
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Bien vu !

    C'est pour cela que lorsque je fais des tests de K-mean avec les images que j'ai pu montrer je ne demande qu'une dizaine de cluster.

    Mais en réalité, l'algo va s'appliquer à des images de résolutions énormes :
    8 000 * 10 000 à peu près pour situer.

    Il y aura également énormément de couleurs, donc les réduire à 256 est un peu plus parlant.

    Merci pour ton explication logicielle sur les K means, j'ai déjà pratiqué cet algorithme mais plus sur papier (hélas). Il est vrai que le message d'erreur est, avec un peu de recul, plus clair.

    En ce moment je suis donc plutôt confronté à des "OUT OF MEMORY" ou encore "size of variable exceeded".
    Mais je règle un peu le programme avant de reposter sur ces problèmes.

    A bientôt donc

Discussions similaires

  1. [POO] Problème avec setInterval/méthodes d'écriture
    Par Lpu8er dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 18/07/2006, 15h37
  2. Réponses: 11
    Dernier message: 03/03/2006, 15h36
  3. problème avec la méthode getElementById() dans Firefox
    Par matrouba dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 19/12/2005, 08h55
  4. Problème avec la méthode pack()
    Par tomca dans le forum Langage
    Réponses: 5
    Dernier message: 15/09/2005, 10h58
  5. [GridBagLayout] Problème de dimension pour un JScrollPane
    Par cmoa59 dans le forum Agents de placement/Fenêtres
    Réponses: 5
    Dernier message: 26/07/2005, 11h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo