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 :

Manipulation des images


Sujet :

C++

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2007
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 39
    Points : 21
    Points
    21
    Par défaut Manipulation des images
    Bonjour à tous .
    Je suis en 1ère année à l'iut informatique et j'ai un projet à rendre dans 10 jours .
    Ce projet consiste à charger une image bmp , la sauvegarder , faire des effets (négatifs , miroir ,flip etc...) mais j'ai déja un problème avec l'ouverture de l'image .
    En effet ,le pc m'affiche tout le temps :
    " Desole , ouverture impossible " .
    Quelqu'un a une idée de ce qui cloche ?
    Merci beaucoup .

    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
     
    #include <iostream>
    #include <fstream>
    #include <cstdlib>
    #include <string>
    using namespace std;
     
    const int MAX = 300;
    typedef int Timage [MAX][MAX];
     
    void chargerImage (string im , Timage &image , char &format , int &valeurformat , int &largeur , int &hauteur , int &max)
    {
         fstream f ;
         f.open( im.c_str() , ios::in ) ;
         if ( f.fail() )
         {
     
              cout<< " Desole , ouverture impossible " <<endl;
     
              }
         f >> format >> valeurformat >> largeur >> hauteur >> max ;
         for ( int i = 0; i < hauteur; i++ ) 
        for ( int j = 0; j < largeur; j++ )
          f >>  image [i][j] ;
          f.close () ;
    }
     
     
     
     
    int main()
    {
     
        Timage image ;
        char format;
        string im = " c:/im.bmp " ;
        int valeurformat, largeur, hauteur, max;
        chargerImage ( im , image , format , valeurformat , largeur , hauteur , max);
    }

  2. #2
    Membre à l'essai
    Inscrit en
    Septembre 2007
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 39
    Points : 21
    Points
    21
    Par défaut
    C'est bon j'ai réussi .
    Tous mes pixels sont casés dans une matrice .
    Par contre ,comment dois-je faire pour afficher cette image
    (car avec cout sa ne fonctionne pas ) ?
    Merci

  3. #3
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Citation Envoyé par pepsi33 Voir le message
    C'est bon j'ai réussi .
    Tous mes pixels sont casés dans une matrice .
    Par contre ,comment dois-je faire pour afficher cette image
    (car avec cout sa ne fonctionne pas ) ?
    Merci
    Aïe.

    Si tu veux l'afficher, tu dois utiliser une bibliothèque graphique. Il y a SDL, mais je ne sais pas si tu as le temps de voir en 10 jours. (Mais tu peux t'inspirer ici)

    Mais si tu n'as que 10 jours il doit y avoir une solution moins contraignante (je ne sais pas si <windows.h> conviendrait...)

    Tu n'as jamais entendu parlé de la programmation GUI?

    Bonne chance

    EDIT:
    Tu es vraiment obligé d'afficher l'image, ou tu n'y appliques que des effets?

  4. #4
    Membre habitué
    Avatar de Nykoo
    Profil pro
    Inscrit en
    Février 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 234
    Points : 166
    Points
    166
    Par défaut
    Citation Envoyé par pepsi33 Voir le message
    (car avec cout sa ne fonctionne pas ) ?
    C'est une blague?

    Tu n'es pas obligé de l'afficher, ton énoncé:

    Ce projet consiste à charger une image bmp , la sauvegarder , faire des effets...
    Donc tu charge ton image dans une matrice, tu inverse par ex ta matrice pour l'effet mirroir, et tu enregistre l'image. Pas besoin de l'afficher, tu as simplement à transformer l'image.

  5. #5
    Membre à l'essai
    Inscrit en
    Septembre 2007
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 39
    Points : 21
    Points
    21
    Par défaut
    Merci !!
    Non je ne connais pas la programmation GIU !
    En fait ,je ne suis pas obligé de l'afficher mais à chaque devoir maison ,j'essaye d'améliorer le sujet !!
    Merci encore.

    J'édite mon message .En fait j'ai un autre problème .
    Une fonction consiste à faire une rotation d'un angle donné (entré par l'utilisateur) de l'image .
    Mais là ,j'ai vraiment aucune idée (car si j'entre par exemples 33 degré ,les pixels dont "déformés" ).
    Donc si vous pourriez m'aider svp ,ce serait vraiment super!!
    Merci beaucoup.

  6. #6
    Membre habitué
    Avatar de Nykoo
    Profil pro
    Inscrit en
    Février 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 234
    Points : 166
    Points
    166
    Par défaut
    Peut être que ça pourra t'aider: http://tuxy2885.free.fr/index.php?ca...al&id=graphics

  7. #7
    Membre à l'essai
    Inscrit en
    Septembre 2007
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 39
    Points : 21
    Points
    21
    Par défaut
    Merci .
    Mais en fait , ce qu'il y a dans ton lien est beaucoup trop compliqué pour moi car on a pour l'instant acquis que les base du c++ ( je suis a l'IUT que depuis septembre ) .
    Quelq'un aurait une autre idée svp ?
    Merci beaucoup

  8. #8
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Les matrices ....

    Une image 2D peut être transformée de toutes les manières possible en usant/abusant de matrices 2x3.
    Et même la mise en perspective avec une matrice 3x3

    Une "transformation" est une matrice M qui transforme les points (Xo,Yo) en (Xd, Yd) avec:

    (Xd,Yd) = (Xo,Yo,1) x M

    ou en (Xd/Wd, Yd/Wd) avec (Xd,Yd,Wd) = (Xo,Yo,1)xM si on utilise des matrices 3x3


    Examples de M:

    Translation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    |1   0 |  
    |0   1 | 
    |Tx  Ty|
    Mirroir X et Y
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    |-1 0|   |1  0| 
    | 0 1|   |0 -1|
    | W 0|   |0  H|
    Rotation de 90° dans le sens des aiguilles d'une montre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    | 0 1|
    |-1 0|
    | W 0|
    Rotation de A radian autour du coin haut-gauche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    | cosA   sinA|
    |-sinA   cosA|
    |  0       0 |
    Bien entendu... c'est combinable par simple mulitplication matricielleen "simulant" la derniere colonne toujours à 0, 0, 1 (avec la notion ci-dessus de gauche à droite)

    Donc, une rotation de A radians autour d'un centre Cx,Cy:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    | 1    0 |   | cosA   sinA|   | 1   0|
    | 0    1 | x |-sinA   cosA| x | 0   1|
    |-Cx  -Cy|   |  0       0 |   |Cx  Cy|
    Soit la matrice:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    |     cosA                sinA           |
    |    -sinA                cosA           |
    |Cx(1-cosA) + Cy sinA    Cy(1-cosA) - Cx sinA  |


    La seule subtilité ici, est que tu dois regarder le CENTRE des pixels et donc, les coordonnées du deuxieme pixel de la premiere ligne sont [1,5 0,5] parcequ'on compte l'ensemble de la surface de l'image (0 est le bord gauche du premier pixel, W le bord droit du deuxieme pixel).

  9. #9
    Membre à l'essai
    Inscrit en
    Septembre 2007
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 39
    Points : 21
    Points
    21
    Par défaut
    Désolé mais je ne comprends rien a tout ca .
    En plus ,on a pas encore vu les matrices 3D (donc pas le droit de les inclures dans le devoir ) mais merci quand mème .

  10. #10
    Membre habitué
    Avatar de Nykoo
    Profil pro
    Inscrit en
    Février 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 234
    Points : 166
    Points
    166
    Par défaut
    Citation Envoyé par pepsi33 Voir le message
    Merci .
    Mais en fait , ce qu'il y a dans ton lien est beaucoup trop compliqué pour moi car on a pour l'instant acquis que les base du c++ ( je suis a l'IUT que depuis septembre ) .
    Quelq'un aurait une autre idée svp ?
    Merci beaucoup
    Et dire que j'avais peur que mon lien soit inutile car trop simple pour toi

    Si tu veux faire une rotation il n'y aura pas plus simple que l'exemple qui est donné dans ce lien. D'ailleurs il n'y a aucune notion du C++ à connaître pour comprendre de simples multiplications et additions.

    C'est comme si tu veux faire une inversion d'image: tu dois faire newX = largeur - oldX; par ex. C'est la seule méthode que je connaisse et il n'y a pas plus simple.

    C'est pareil pour la solution donné dans le lien. Sauf que c'est une rotation donc tu es obligé de passer par des cos et sin (il y a un angle de rotation). Comment tu veux faire plus simple? Tu ne trouveras pas de solution miracle

    Par contre tu as déjà calculé à la main la rotation d'un point de coordonnées (x,y) dans un repère classique? Si tu ne sais pas le faire à la main tu ne sauras pas le faire par miracle dans ton programme. Mais ça n'est pas bien compliqué rassure toi.

  11. #11
    Membre à l'essai
    Inscrit en
    Septembre 2007
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 39
    Points : 21
    Points
    21
    Par défaut
    Oui mais par exemples ,si l'utilisateur demande à faire une rotation de 33 degré ,c'est quoi old(x) ,new (x) ,t(x) etc ... ?

  12. #12
    Membre habitué
    Avatar de Nykoo
    Profil pro
    Inscrit en
    Février 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 234
    Points : 166
    Points
    166
    Par défaut
    Par ex si t'a un point (oldX,oldY):

    newX = oldX*cos(alpha) - oldY*sin(alpha)
    newY = oldX*sin(alpha) + oldY*cos(alpha)

    Ca c'est si tu tournes autour de l'origine du repère (en bas à gauche de l'image)

    Toi j'imagine que tu veux tourner autour du centre de l'image? Donc tu fais un changement de repère (c'est un mot barbare mais rien de plus simple):

    newX = (oldX-Xa)*cos(alpha) - (oldY-Ya)*sin(alpha) + Xa
    newY = (oldX-Xa)*sin(alpha) + (oldY-Ya)*cos(alpha) + Ya

    Xa et Ya c'est les coordonnées du point autour duquel tu veux tourner. Ici Xa = largeur /2 et Ya = hauteur/2.

    Maintenant tu traduis ce que j'ai dit en anglais, t'enlève les erreurs que j'ai faite parce que je suis pressé et t'obtiens ce qu'il y a dans le lien que je t'ai passé:

    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 rotate(Image &src, Image &dst, float alpha)
    {
       int halfWidth = img.Width / 2;
       int halfHeight = img.Height / 2;
       for (int x = 0; x < dst.Width; x++)
       {
          for (int y = 0; y < dst.Height; y++)
          {
             int xOr = (int)((x - halfWidth) * cos(alpha) + (y - halfHeight) * sin(radius) + halfWidth);
             int yOr = (int)(-(x - halfWidth) * sin(alpha) + (y - halfHeight) * cos(radius) + halfHeight);
     
             if (xOr >= 0 && yOr >= 0 && xOr < dst.Width && yOr < dst.Height)
                dst.Pixel[y * dst.Width + x] = src.Pixel[(int)(y * fRatioY) * src.Width + (int) x * fRatioX];
          }
       }
    }
    La dernière ligne j'ai pas trop regardé mais ça doit être pour mettre les pixels calculés dans les cases du tableau (on ne peut pas mettre un pixel à des coordonnées non entières).

    Tu notera que la difficulté n'est en rien liée à la connaissance du C++.

    La technique des matrices que t'as montré nicroman est faite pour simplifier et éviter de marquer les calculs ligne par ligne. Surtout si tu travailles en 3d.

  13. #13
    Membre à l'essai
    Inscrit en
    Septembre 2007
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 39
    Points : 21
    Points
    21
    Par défaut
    Merci beaucoup ,j'ai à peu près compris !
    Par contre ,j'ai encore une petite question (désolé ,lol) :
    - A quoi correspond "point (oldX,oldY)" (a quoi il sert ce point ?)
    Et je ne comprend pas la dernière ligne (ratio , (int) ).

  14. #14
    Membre habitué
    Avatar de Nykoo
    Profil pro
    Inscrit en
    Février 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 234
    Points : 166
    Points
    166
    Par défaut
    Moi aussi il y a un truc que je ne comprends pas. Je verrai ce soir si personne d'autre ne t'a aider avant.

    Pour info:

    (int) variable -> converti variable en int
    (oldX,oldY) -> points à déplacer par rotation

  15. #15
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Nykoo Voir le message
    La technique des matrices que t'as montré nicroman est faite pour simplifier et éviter de marquer les calculs ligne par ligne. Surtout si tu travailles en 3d.
    En même temps, le calcul matriciel est un peu la base du calcul sur ordinateur, et, en tant que représentation numérique de la géométrie, enormément celle du traitement d'image... Faire du traitement d'image sans faire de calcul matricielle c'est un peu apprendre à conduire sans avoir vu le code de la route... c'est pas impossible, mais carrément stupide.

    D'autant que le code est tout aussi simple (on peut l'améliorer pour faire du joli C++, mais l'idée est là):
    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    struct Matrice2x3 {
       float  _00, _01, _02; // first column
       float  _10, _11, _12; // second column
    };
     
    struct Image {
       long     width;
       long     height;
       size_t   lineStride; // pour passer d'une ligne à une autre dans les données (égal à width dans la plupart des cas, mais de nombreuses images ont du 'padding' pour avoir des nombres de pixels multiple de 4 ou 8, quand ce n'est pas carrément une puissance de 2)
       Pixel*   data;
    };
     
     
    inline Pixel Safe_GetPixel(const Image& src, int x, int y)
    {
        return (x >= 0 && x < src.width) && (y >= 0 && y < src.height) ? src.data[x+y*lineStride] : Pixel(0) // or anything
    }
     
     
     
    void TraitementImage(Image& dest, const Image& src, const Matrice2x3& transform)
    {
        Pixel* destLine = dest.data;
        for (int destLineIdx = 0; (destLineIdx < dest.height); ++destLineIdx) {
           // calcul des invariants pour cette boucle
           float dstY = float(destLineIdx) + 0.5f;
           float baseSrcX = dstY * transform._01 + transform._02;
           float baseSrcY = dstY * transform._11 + transform._12;
     
           // préparation boucle sur les colonnes
           Pixel* dest = destLine;
           for (int destColIdx = 0; (destColIdx < dest.width); ++destColIdx) {
              // calcul des invariants pour cette boucle
              float dstX = float(destColIdx) + 0.5f;
              float srcX = dstX * transform._00 + baseSrcX ;
              float srcY = dstX * transform._10 + baseSrcY;
              // et hop !
              *dest++ = Safe_GetPixel(src,(int)srcX,(int)srcY);
           }
     
           // on passe à la ligne suivante
           destLine += dest.lineStride;
        }
    }
     
     
    //
    // Implémentation du mirroir... facile...
    //
    void MirroirX(Image& dest, const Image& src)
    {
        Matrice2x3 mirrorX = { -1.0f, 0.0f, src.width, 0.0f, 1.0f, 0.0f };
        TraitementImage(dest,src,mirrorX);
    }
     
    //
    // Implémentation de la rotation autour du centre
    // on pourrait rajouter une fonction intermediaire pour une rotation autour de n'importe quel point
    //
    void RotationCentre(Image& dest, const Image& src, float radians)
    {
        float centerX = float(width) * .5f + .5f;
        float centerY = float(height) * .5f + .5f;
     
        Matrice2x3 rotation;
        rotation._00 = rotation._11 = cos(radians);
        rotation._10 = sin(radians);
        rotation._01 = -rotation._10;
        // le compilo fait cette 'optimisation' très bien... c'est juste plus lisible
        float one_minus_cos = 1.f - rotation._00;
        rotation._02 = centerX * one_minus_cos  + centerY * rotation._10;
        rotation._12 = centerY * one_minus_cos  + centerX * rotation._01;
     
        TraitementImage(dest,src,rotation);
    }
    ....

  16. #16
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Points : 2 501
    Points
    2 501

Discussions similaires

  1. Manipulation des images au format Dicom
    Par Lost in dans le forum Images
    Réponses: 8
    Dernier message: 16/02/2008, 18h12
  2. manipuler des images
    Par Phenix789 dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 28/11/2007, 21h51
  3. Meilleure methode pour manipuler des images
    Par etranger dans le forum Modules
    Réponses: 2
    Dernier message: 16/02/2007, 13h06
  4. [VBA-E]Manipuler des images
    Par nils.angot dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 14/02/2006, 10h59

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