Bonjour,
je viens de créer un algo pour split une image dans le cadre d'un futur split/merge. Mais j'ai un léger souci, mon découpage fonctionne uniquement sur des images ayant des longueurs et des largeurs multiples de 2.
L'erreur doit être toute bête probablement mais la je n'arrive pas à comprendre pourquoi :/
Voila ma méthode qui trace mes lignes de découpage :
Et voici le code qui s'occupe de split et de trouver l'homogénéité de l'image
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 void Node::decoupeImg(IplImage * img) { if(img != NULL && img->nChannels == 1) { CvScalar sc = cvScalar(51,204,0); if(fils[0] != NULL) { cvLine(img, cvPoint(x + abscisse/2, y), cvPoint(x + abscisse/2, y + ordonnee), sc, 1); cvLine(img, cvPoint(x, y + ordonnee/2), cvPoint(x + abscisse, y + ordonnee/2), sc, 1); fils[0]->decoupeImg(img); fils[1]->decoupeImg(img); fils[2]->decoupeImg(img); fils[3]->decoupeImg(img); } } }
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 void Node::split(IplImage * img, double seuil){ if(!this->homogeneite(img, seuil)) { int moitieAbscisse = (int) this->getAbscisse()/2; int moitieOrdonnee = (int) this->getOrdonnee()/2; if(moitieAbscisse > 0 && moitieOrdonnee > 0) { Node * pere = this; Node * filsHG = new Node(this->getX(), this->getY(), moitieAbscisse, moitieOrdonnee, abscinit, ordinit); Node * filsHD = new Node(this->getX() + moitieAbscisse, this->getY(), moitieAbscisse, moitieOrdonnee, abscinit, ordinit); Node * filsBG = new Node(this->getX(), this->getY() + moitieOrdonnee, moitieAbscisse, moitieOrdonnee, abscinit, ordinit); Node * filsBD = new Node(this->getX() + moitieAbscisse, this->getY() + moitieOrdonnee, moitieAbscisse, moitieOrdonnee, abscinit, ordinit); this->setFils(filsHG, filsHD, filsBG, filsBD); filsHG->setPere(this); filsHG->split(img, seuil); filsHD->setPere(this); filsHD->split(img, seuil); filsBG->setPere(this); filsBG->split(img, seuil); filsBD->setPere(this); filsBD->split(img, seuil); } } }Je pensais à une erreur de conversion de mes variables.
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52 bool Node::homogeneite(IplImage * img, double seuil) { if(img != NULL && img->nChannels == 1) { double moyenne = 0; double variance = 0; double probpix = 0; int sommeX = 0; int indice, donnees; double tabprob[256] = {0}; double nbPoints = (double)abscisse * (double)ordonnee; for(int i = y; i < y + ordonnee; i++) { for(int j = x; j < x + abscisse; j++) { indice = (i*(abscinit)+j); donnees = (unsigned char) img->imageData[indice]; sommeX += donnees; tabprob[donnees] ++; } } //Calcul de la moyenne : (formule meilleure : (n1*x1+...+ni*xi)/sum(ni), ni : nb pixel de valeur xi) moyenne = ((double)sommeX / (double)nbPoints); for(int i = 0; i <= 255; i++) { if(tabprob[i] != 0) { probpix = ((double)tabprob[i]/(double)nbPoints); variance += probpix * (i - moyenne) * (i - moyenne); } } variance = sqrt(variance); //Calcul du taux de disparité, si inférieur à 10% alors homogène if((moyenne-variance) >= 0) { variance = variance * 2; variance = (variance / 256)*100; } else { variance = moyenne + variance; variance = (variance / 256)*100; } if(variance < seuil) return true; return false; } return true; }
Edit, j'ai rajouté les tests suivants pour ma création de nodes pour tenir compte des cotés pair*pair / pair*impair / impair*pair / impair*impair
Mais ca ne change rien. Donc je ne pense pas que le problème vient de ma création de node.
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64 if(moitieAbscisse%2 == 1 && moitieOrdonnee%2 == 1) { Node * filsHG = new Node(this->getX(), this->getY(), moitieAbscisse, moitieOrdonnee, abscinit, ordinit); Node * filsHD = new Node(this->getX() + moitieAbscisse+1, this->getY(), moitieAbscisse+1, moitieOrdonnee, abscinit, ordinit); Node * filsBG = new Node(this->getX(), this->getY() + moitieOrdonnee+1, moitieAbscisse, moitieOrdonnee+1, abscinit, ordinit); Node * filsBD = new Node(this->getX() + moitieAbscisse+1, this->getY() + moitieOrdonnee+1, moitieAbscisse+1, moitieOrdonnee+1, abscinit, ordinit); filsHG->setPere(this); filsHD->setPere(this); filsBG->setPere(this); filsBD->setPere(this); this->setFils(filsHG, filsHD, filsBG, filsBD); filsHG->split(img, seuil); filsHD->split(img, seuil); filsBG->split(img, seuil); filsBD->split(img, seuil); } else if(moitieAbscisse%2 == 0 && moitieOrdonnee%2 == 1) { Node * filsHG = new Node(this->getX(), this->getY(), moitieAbscisse, moitieOrdonnee, abscinit, ordinit); Node * filsHD = new Node(this->getX() + moitieAbscisse, this->getY(), moitieAbscisse, moitieOrdonnee, abscinit, ordinit); Node * filsBG = new Node(this->getX(), this->getY() + moitieOrdonnee+1, moitieAbscisse, moitieOrdonnee+1, abscinit, ordinit); Node * filsBD = new Node(this->getX() + moitieAbscisse, this->getY() + moitieOrdonnee+1, moitieAbscisse, moitieOrdonnee+1, abscinit, ordinit); filsHG->setPere(this); filsHD->setPere(this); filsBG->setPere(this); filsBD->setPere(this); this->setFils(filsHG, filsHD, filsBG, filsBD); filsHG->split(img, seuil); filsHD->split(img, seuil); filsBG->split(img, seuil); filsBD->split(img, seuil); } else if(moitieAbscisse%2 == 1 && moitieOrdonnee%2 == 0) { Node * filsHG = new Node(this->getX(), this->getY(), moitieAbscisse, moitieOrdonnee, abscinit, ordinit); Node * filsHD = new Node(this->getX() + moitieAbscisse+1, this->getY(), moitieAbscisse+1, moitieOrdonnee, abscinit, ordinit); Node * filsBG = new Node(this->getX(), this->getY() + moitieOrdonnee, moitieAbscisse, moitieOrdonnee, abscinit, ordinit); Node * filsBD = new Node(this->getX() + moitieAbscisse+1, this->getY() + moitieOrdonnee, moitieAbscisse+1, moitieOrdonnee, abscinit, ordinit); filsHG->setPere(this); filsHD->setPere(this); filsBG->setPere(this); filsBD->setPere(this); this->setFils(filsHG, filsHD, filsBG, filsBD); filsHG->split(img, seuil); filsHD->split(img, seuil); filsBG->split(img, seuil); filsBD->split(img, seuil); } else { Node * filsHG = new Node(this->getX(), this->getY(), moitieAbscisse, moitieOrdonnee, abscinit, ordinit); Node * filsHD = new Node(this->getX() + moitieAbscisse, this->getY(), moitieAbscisse, moitieOrdonnee, abscinit, ordinit); Node * filsBG = new Node(this->getX(), this->getY() + moitieOrdonnee, moitieAbscisse, moitieOrdonnee, abscinit, ordinit); Node * filsBD = new Node(this->getX() + moitieAbscisse, this->getY() + moitieOrdonnee, moitieAbscisse, moitieOrdonnee, abscinit, ordinit); filsHG->setPere(this); filsHD->setPere(this); filsBG->setPere(this); filsBD->setPere(this); this->setFils(filsHG, filsHD, filsBG, filsBD); filsHG->split(img, seuil); filsHD->split(img, seuil); filsBG->split(img, seuil); filsBD->split(img, seuil); }
Je pense qu'une image pourra éclairer mon souci. On voit que le découpage de l'image passe d'un coté à l'autre
On remarque un maillage déformé et mal positionné. Si je redimensionne l'image en 400*400 le découpage est correct.
Donc si quelqu'un à une idée...
Edit :
J'ai résolu mon problème en remplaçant mon indice par la fonction openCV appropriée soit :
Maintenant reste un problème, c'est comment tenir compte des lignes que j'ignore car en divisant par 2, mes images avec des cotés impairs perdent une ligne et/ou une colonne de pixel lorsque je les split.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 s=cvGet2D(img,i,j); donnees = s.val[0];
Partager