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]) :
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.
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); } }
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
Partager