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

Traitement d'images Discussion :

Split sur une image non multiple de 2


Sujet :

Traitement d'images

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 80
    Points : 65
    Points
    65
    Par défaut Split sur une image non multiple de 2
    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.

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    je n'ai pas tout regardé mais c'est à mon avis simplement une question d'avoir utilisé des "<" au lieu de "<=" dans une boucle..

    (ou, ce qui revient au même, une vérification d'arrondi ou de 0/1)

  3. #3
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 80
    Points : 65
    Points
    65
    Par défaut
    Je suis justement en train de vérifier tout ça .
    Je tiens au courant si je parviens à trouver une solution ou si je n'en trouve pas.

  4. #4
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Il vaut mieux éviter les calculs du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    LargeurBloc = LargeurImage/2;
    HauteurBloc = HauteurImage/2;
    HautGauche = { X, Y, LargeurBloc, HauteurBloc);
    HautDroite = { X+LargeurBloc, Y, LargeurBloc, HauteurBloc);
    ...
    Car ca induit des problèmes de positionnement/taille quand les dimensions de l'image ne sont pas des multiples de 2.

    Il vaut mieux faire un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    LargeurBlocGauche = LargeurImage/2;
    LargeurBlocDroite = LargeurImage-LargeurBlocGauche;
     
    HauteurBlocHaut = HauteurImage/2;
    HauteurBlocBas = HauteurImage - HauteurBlocHaut;
     
    HautGauche = { X, Y, LargeurBlocGauche, HauteurBlocHaut);
    HautDroite = { X+LargeurBlocGauche, Y, LargeurBlocDroite, HauteurBlocHaut);
    ...

  5. #5
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 80
    Points : 65
    Points
    65
    Par défaut
    Grand merci à toi !
    Pourquoi n'avais-je pas pensé à ça plus tôt au lieu de m'embêter avec des modulo :/

    En tout cas maintenant tout fonctionne à merveille !

    Merci à toi PseudoCode

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Placer une image sur une vidéo non démarrée
    Par ChPr dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 15/05/2011, 23h57
  2. Réponses: 2
    Dernier message: 03/09/2010, 19h31
  3. [AJAX] Afficher une image non enregistrée sur le serveur
    Par magicbisous-nours dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 09/01/2009, 09h19
  4. [2.0] Split sur une chaîne et non un tableau de caractères
    Par franculo_caoulene dans le forum VB.NET
    Réponses: 5
    Dernier message: 11/06/2008, 11h50
  5. Test multiple sur une variable non définie
    Par Rei Angelus dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 12/12/2007, 22h01

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