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 :

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);
		}  
	}
}
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
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);
		}	
	}
}
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;
}
Je pensais à une erreur de conversion de mes variables.

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

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);
			}
Mais ca ne change rien. Donc je ne pense pas que le problème vient de ma création de node.

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 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
s=cvGet2D(img,i,j);
donnees = s.val[0];
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.