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

C++ Discussion :

Définir un angle de rotation pour une image


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2005
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 37
    Points : 25
    Points
    25
    Par défaut Définir un angle de rotation pour une image
    Bonjour,

    Je possède une image BMP représentant un bouchon de pellicule photo vu de dessus. Cette image a été seuillée (mise en noir et blanc) et se présente de cette manière : un demi-cercle en noir et l'autre demi-cercle en blanc.

    Ce que je cherche à faire, c'est trouver la droite qui sépare ces deux zones (en gros, il s'agit de la droite qui représente le diamètre du cercle) et déterminer l'angle selon lequel je dois faire pivoter l'image pour que cette droite se retrouve à l'horizontale.

    Quel moyen puis-je utiliser pour repérer la droite et trouver l'angle de rotation ?

  2. #2
    Membre averti Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Points : 404
    Points
    404
    Par défaut
    Salut,

    Peut-être avec les moments généralisés sur un des 2 demi-cercles.
    Cela devrait te donner l'orientation de ton demi-cercle.
    Cependant je ne suis pas sur que l'orientation du demi-cercle corresponde à l'angle de l'axe qui sépare tes 2 demi-disques.

    A essayer.

    A+

    Flo.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Janvier 2005
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 37
    Points : 25
    Points
    25
    Par défaut
    OK, merci pour ta réponse, je vais essayer, on verra bien si ça marche, sinon, j'abandonne cette partie (je me suis déjà assez cassé les dents là-dessus).

    Encore merci et bonne journée...

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    Pour ma part, je commencerais par chercher tous les points d'une couleur qui ont un voisin immédiat d'une autre couleur ce qui devrait te donner tous les points (n) qui se trouvent à la frontiere blanche/noire...

    Ensuite, pour chaque couple (n*(n-1)) de ces points je calculerais les caractéristiques (d, teta) de la droite les reliants, où d est la distance à l'origne et teta l'angle par rapport à l'horizontale. (par ex arctan(a) où a viens de y=ax+b)

    nous voilà donc avec une distribution de d'angles, reste à en prendre celui qui à la frequence maximum, la médiane ou la moyenne...

  5. #5
    Nouveau membre du Club
    Inscrit en
    Janvier 2005
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 37
    Points : 25
    Points
    25
    Par défaut
    OK, merci pour vos réponses, je pense que je peux y arriver, maintenant.
    Merci à tous et bonne journée !

  6. #6
    Membre averti Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Points : 404
    Points
    404
    Par défaut
    Salut,

    voila le code :

    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
    		int height = 256;
    			int width  = 256;
     
    			int surface = 0;
    			int somx = 0;
    			int somy = 0;
    			int somxx = 0;
    			int somyy = 0;
    			int somxy = 0;
     
    			for(int y = 0; y < height; y++)
    				for(int x = 0; x < width; x++)
    					if(src[y*width+x] == 255)
    					{
    						surface++;				
    						somx += x;
    						somy += y;	
    						somxx += x * x;
    						somyy += y * y;
    						somxy += x * y;		
    					}
     
    			double m11 = (double)somxy - (double)somx * (double)somy / (double)surface;
    			double m02 = (double)somyy - (double)somy * (double)somy / (double)surface;
    			double m20 = (double)somxx - (double)somx * (double)somx / (double)surface;
     
    			double angle = atan2(2.0 * m11, m20 - m02) / 2.0 * 180.0 / M_PI;
    J'ai essayé et ça a l'air de marcher.
    Pour l'explication, cf. les moments généralisés.

    A+

    Flo.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 28/04/2010, 18h17
  2. Problème pour faire la rotation d'une image(Avec ImageJ)
    Par tadjara dans le forum Traitement d'images
    Réponses: 4
    Dernier message: 12/04/2010, 11h48
  3. Problème pour faire la rotation d'une image(Avec ImageJ)
    Par tadjara dans le forum Débuter avec Java
    Réponses: 0
    Dernier message: 10/04/2010, 11h33
  4. pb pour la rotation d'une image
    Par wawawa dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 04/05/2007, 17h33
  5. filtre séparable pour une image
    Par tlemcenvisit dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 31/05/2005, 16h45

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