Bonjour,
Voilà je travaille actuellement sur un algo de traitement de l'image. Le but étant de reconnaitre les formes sur une image binarisée (noir et blanc). Mon algo se base sur un théorie que j'ai pensée à force de m'énerver sur les algos classiques qui ne marchent pas ^^
Je parcours mon image en long et en large, et lorsque je trouve un pixel interessant ( en noir) je lance ma boucle réccursive qui va chercher tous les voisins à partir de ce pixel noir, et les voisins des voisins... etc...
Apres avoir été confronté à une tonne de stack overflow... j'ai compris que d'augmenter la taille de la pile pourrait suffir à débugguer mon programme. En effet, le code fonctionne tres bien, cependant, j'ai besoin des parametres de pile suivants :
taille de la réserve de pile : 4000000
taille de validation de pile : 10000
(soit : /STACK:4000000,10000 )
Est ce normal d'en arriver là pour faire tourner un algo réccursif qui ne me parrait pas si "bourrin" que ça ?
PS : je tourne sous Visual C++ express
Voilà le code utilisé :
Code:
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 ImagePGM pgm_bin("test.pgm"); Binaire bin2(200); //seuil de binarisation S2D<unsigned char> s_bin = bin2(pgm_bin.GetData()); pgm_bin.Save("test_binarise.pgm"); S2D<int> C(pgm_bin.Width(),pgm_bin.Height()); C.set(0); int classe = 1; for(int i=1 ; i<pgm_bin.Width(); i++) for(int j=1 ; j<pgm_bin.Height(); j++) { //Si il dépasse le seuil on le récupere (et si il n'est pas déjà classé) if((s_bin[j][i] > 200) && (C[j][i] == 0)) { select_classe(&s_bin, &C, i, j, classe, 200); classe++; cout << "classe " << classe << endl; //system("pause"); } }
Code:
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 /** Fonction récursive de selection d'une classe par propagation **/ void select_classe( S2D<unsigned char>* s_bin, S2D<int>* C, int w, int h, int classe, int seuil) { /* 1 | 2 | 3 4 | X | 5 6 | 7 | 8 */ //cout << "Appel en ["<<w<<"]["<<h<<"]"<<endl; //cas d'arret if(((*s_bin)[h][w] > seuil) && ((*C)[h][w] == 0)) { //on marque le courant. (*C)[h][w] = classe; //cout<<"On marque C["<<h<<"]["<<w<<"] avec la classe "<<classe<<endl; //system("pause"); /* //les voisins sont > seuil ou encore non classés if(((*s_bin)[h-1][w-1] > seuil) && ((*C)[h-1][w-1] == 0)) //1 select_classe(s_bin, C, w-1, h-1, classe, seuil); */ if(((*s_bin)[h][w-1] > seuil) && ((*C)[h][w-1] == 0)) //2 select_classe(s_bin, C, w-1, h, classe, seuil); /* if(((*s_bin)[h+1][w-1] > seuil) && ((*C)[h+1][w-1] == 0)) //3 select_classe(s_bin, C, w-1, h+1, classe, seuil); */ if(((*s_bin)[h-1][w] > seuil) && ((*C)[h-1][w] == 0)) //4 select_classe(s_bin, C, w, h-1, classe, seuil); if(((*s_bin)[h+1][w] > seuil) && ((*C)[h+1][w] == 0)) //5 select_classe(s_bin, C, w, h+1, classe, seuil); /* if(((*s_bin)[h-1][w+1] > seuil) && ((*C)[h-1][w+1] == 0)) //6 select_classe(s_bin, C, w+1, h-1, classe, seuil); */ if(((*s_bin)[h][w+1] > seuil) && ((*C)[h][w+1] == 0)) //7 select_classe(s_bin, C, w+1, h, classe, seuil); /* if(((*s_bin)[h+1][w+1] > seuil) && ((*C)[h+1][w+1] == 0)) //8 select_classe(s_bin, C, w+1, h+1, classe, seuil); */ } return; }
Merci de vos conseils.