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 :

Rotation d'image avec tableau 1D


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Polynésie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 11
    Points : 14
    Points
    14
    Par défaut Rotation d'image avec tableau 1D
    Bonjour,

    Voilà un moment que je bloque sur une ligne de code, avec une erreur que je trouve assez... chelllooouuuu.
    Je n'utilise que des images bitmap en 256 couleurs.

    Code C : 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
     
        int ix;
        int iy;
        int xpos;
        int ypos;
        float xOff;
        float yOff;
        float x0 = imageWidth/2.0f;
    	float y0 = imageHeight/2.0f;
     
        for( ix = 0; ix < imageWidth; ix++ ){
            for( iy = 0; iy < imageHeight; iy++ )
            {
                xOff = ix - x0;
                yOff = iy - y0;
                xpos = (int)(xOff*cos_theta + yOff*sin_theta + x0 );
                ypos = (int)(yOff*cos_theta - xOff*sin_theta + y0 );
     
                if(((int)xpos>=0) && ((int)xpos< imageWidth) && ((int)ypos>=0) && ((int)ypos< imageHeight)){
                    outputImage[iy*imageWidth+ix] = inputImage[ypos*imageWidth+xpos];
                }
     
            }
        }

    Image obtenue(tout est ok) :
    Nom : 203507outputsequentialrotation.png
Affichages : 146
Taille : 109,4 Ko

    ensuite je modifie ça :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        outputImage[iy*imageWidth+ix] = inputImage[ypos*imageWidth+xpos];

    Par ça :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        outputImage[ypos*imageWidth+xpos] = inputImage[iy*imageWidth+ix];

    ce qui donne :
    Nom : 167096outputsequentialrotation.png
Affichages : 150
Taille : 117,8 Ko

    Les pixels noirs... je ne vois absolument pas... l'erreur, un doigt à couper que c'est une erreur d'index sur un des deux tableau !
    (PS : Promis j'ai cherché un long moment)

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Il est un peu tard , mais il y a :
    • 2 trucs visibles sur ta photo : 1) les points manquants forment un motif qui se répète 2) tu n'as pas la même image, elle est recadrée
    • un truc simple à faire - tu n'as qu'à mettre un log dans le "else"



    Mais je mets une pièce sur cette erreur : tu ne manipules pas une matrice comme un entier.
    Tu croire que pour arriver à ton résultat, tu peux faire comme un entier en "inversant" le résultat. Mais je pense que ce qui se passe, tu as une symétrie centrale (*) et donc ton image n'a plus une définition de (width * height) mais de (height * width).

    Parce en regardant sur wiki, la matrice inverse est (cos sin) pour la première ligne et (-sin cos) pour la deuxième ligne (ce sont les sinus qui ont été multipliés par -1)

    Édit : * -> il me semble qu'il y a un effet miroir

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Polynésie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 11
    Points : 14
    Points
    14
    Par défaut
    Merci pour ton aide, j'ai modifié le if par :

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    if((ypos*imageWidth+xpos)>=0 && (ypos*imageWidth+xpos)<(imageWidth*imageHeight) && ((int)xpos< imageWidth) && ((int)ypos< imageHeight)&& ((int)xpos>0) && ((int)ypos>0))

    et c'est nettement mieux.

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    L'erreur constatée dans ton premier me rappelle des souvenirs, je suis moi-même passé par là.
    Ton premier code (celui qui marche) suit l'algorithme "Pour chaque pixel de l'image de destination, on regarde à quoi ça correspond sur l'image source." Et ça marche à merveille.
    Ton second code (celui qui ne marche pas) suit l'algorithme "Pour chaque pixel de l'image source, on regarde où il va sur l'image de destination." Le problème, c'est qu'à cause des arrondis, il arrive que deux pixels "source" arrivent au même endroit sur l'image de destination. Et pour chaque pixel "source" qui arrive à une destination déjà occupée, il y a un pixel "destination" qui ne reçoit jamais d'info...

    L'effet est encore plus facile à voir si au lieu (ou en plus) d'une rotation, tu fais un zoom: Pour un zoom ×2, tu as 4 pixels destination correspondant à un seul pixel source, donc si tu cherches simplement à mapper les pixels "source" un par un, tu auras les trois quarts des pixels "destination" qui seront toujours noirs.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Polynésie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 11
    Points : 14
    Points
    14
    Par défaut
    Merci expliqué comme ça, c'est beaucoup plus clair en effet.

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

Discussions similaires

  1. Rotation d'image avec bitblt/xform
    Par uknow dans le forum C++Builder
    Réponses: 1
    Dernier message: 11/07/2011, 17h46
  2. 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
  3. [GD] rotation d'une image avec GD
    Par DiverSIG dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 09/09/2009, 09h23
  4. Rotation d'image avec Wiaaut.dll
    Par exclusif dans le forum Windows Forms
    Réponses: 1
    Dernier message: 13/02/2007, 00h17
  5. Class de gestion des images avec rotation
    Par Johnny Boy dans le forum MFC
    Réponses: 1
    Dernier message: 03/05/2005, 11h54

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