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

OpenCV Discussion :

Algorithme des K-means


Sujet :

OpenCV

  1. #1
    Membre confirmé
    Avatar de betsprite
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    472
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 472
    Points : 528
    Points
    528
    Par défaut Algorithme des K-means
    Bonsoir,

    Je suis en train d'implémenter l'algorithme des K-moyens mais je rencontre un petit problème sous openCV.

    Tout d'abord, voici la première partie de l'algorithme qui, à partir d'une liste LC de centroïdes préinitialisés (c'est des type double qui correspondent aux moyennes des valeurs des pixels des zones homogènes retenues lors de l'initialisation), va essayer de trouver, pour chaque pixel de l'image, le centroïde qui lui est le plus proche (abs(I(x,y)-LC[k]) :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    void algoKM(IplImage* image, vector<double> LC)
    {
        double ctmp;
        int pos = 0;
        CvMat* clustering = cvCreateMat(image->height, image->width, CV_32FC1);
     
        // On teste l'appartenance de chaque pixel de l'image à l'un des centroïdes :
        for(int j=0;j<image->height;j++)
        {
            for(int i=0;i<image->width;i++)
            {
                // On parcours les centroïdes à la recherche du plus proche :
                ctmp = LC[0];
     
                for(int k=1;k<LC.size();k++)
                {
                    if (abs(LC[k] - cvGet2D(image, j, i).val[0]) < abs(ctmp - cvGet2D(image, j, i).val[0]))
                    {
                        ctmp = LC[k];
                        pos = k;
                    }
                }
     
                // On remplie une matrice représentant les pixels de l'image avec pour valeur la position du centroïde de la liste LC auquel il apprtient :
                cvmSet(clustering, j, i, pos);
            }
        }
    Le soucis étant que, si lors du test d'appartenance, dans les boucles "for" je mets i<10 et j<10 par exemple, l'algorithme semble fonctionner.

    Si par contre je met "i<image->width" et "j<image->height", le programme ne fonctionne plus (l'image disparaît lors de l'affichage et la console me retourne un nombre bizarre) et j'obtiens le screen ci-dessous, l'affichage initial de la console représentant les 10 centroides initiaux.

    Des idées ?

    Je vous remercie
    Images attachées Images attachées  

  2. #2
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 37
    Points : 33
    Points
    33
    Par défaut
    avez vous trouvé des solutions à ceproblme , ça m'interesse aussi ^^

Discussions similaires

  1. Implémentation algorithme des k-means
    Par superdose dans le forum MATLAB
    Réponses: 0
    Dernier message: 30/05/2014, 17h52
  2. Réponses: 1
    Dernier message: 28/06/2011, 09h28
  3. Reconnaissance de forme et algorithme des k-means
    Par image44 dans le forum Méthodes prédictives
    Réponses: 10
    Dernier message: 30/06/2010, 10h39
  4. Algorithmes des coureurs !
    Par fatifati dans le forum Pascal
    Réponses: 7
    Dernier message: 06/03/2007, 16h44

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