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++Builder Discussion :

Conversion de l'image en nuance de gris


Sujet :

C++Builder

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 89
    Points : 57
    Points
    57
    Par défaut Conversion de l'image en nuance de gris
    Salut
    Je cherche à améliorer ce programme qui fait la conversion d'une image couleur en une image en nuance de gris.
    Je demande aux experts de la programmation si ce programme est bien optimal:
    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
    void _fastcall TForm1::MakeGreyScale(TImage* image)
    {
    TColor color;
    byte r,g,b,gr;
    for (int x=0;x<Image1->Width;x++)
    for(int y=0;y<Image1->Height;y++)
      {
       color = Image1->Canvas->Pixels[x][y];
       r=GetRValue(color);
       g=GetGValue(color);
       b=GetBValue(color);
       gr = (r+g+b)div 3;
       Image1->Canvas->Pixels[x][y]=RGB(gr,gr,gr);
      }
    }
    et Merci d'avance

  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,

    Il faut utiliser ScanLine :

    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
    for(int i = 0; i < Image1->Picture->Bitmap->Height; i++)
    {
            BYTE * row = (BYTE*)Image1->Picture->Bitmap->ScanLine[i];
     
            for(int j = 0; j < Image1->Picture->Bitmap->Width; j++)
            {
                BYTE * col = (BYTE*)(row + j * 3);
                unsigned char gris = (unsigned char)((col[0] + col[1] + col[2]) / 3);
                col[0] = gris;
                col[1] = gris;
                col[2] = gris;
            }
     
    }
     
    Image1->Refresh();
    A+

    Flo.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 89
    Points : 57
    Points
    57
    Par défaut oui mais je n'ai pas vraiment compris
    Merci beaucoup, je l'ai essayé, c'est ultra-rapide! mais je n'ai pas très bien compris. S'il te plaît commentes ce programme.
    Merci d'avance.

  4. #4
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    Si tu veux des infos sur scanline va voir le site:
    http://nono40.developpez.com/tutorie...i/efg/scanline

    C'est en Delphi, mais pour ce qui du principe, c'est la même chose que BCB.

  5. #5
    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 et pardon pour l'absence de commentaires. En général c'est pas mon style .

    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
    // on parcourt chaque ligne de l'image
    for(int i = 0; i < Image1->Picture->Bitmap->Height; i++)
    {
            // on récupère un pointeur sur la ieme ligne de pixels
            // C'est organisé comme ça : BGRBGRBGRBGRBGRBGRBGR ...
            BYTE * row = (BYTE*)Image1->Picture->Bitmap->ScanLine[i];
     
            // on parcourt chaque colonne de l'image
            for(int j = 0; j < Image1->Picture->Bitmap->Width; j++)
            {
                // on récupère un pointeur sur le jieme pixel de la ieme ligne
                // on va de 3 en 3 puisqu'on a en suivant les 3 valeurs BGR pour un pixel
                BYTE * col = (BYTE*)(row + j * 3);
     
                // on fait du gris
                unsigned char gris = (unsigned char)((col[0] + col[1] + col[2]) / 3);
     
                col[0] = gris; // on assigne à la composante bleue la valeur de gris
                col[1] = gris; // on assigne à la composante verte la valeur de 
                col[2] = gris; // on assigne à la composante rouge la valeur de 
            }
     
    }
     
    // on rafraichit l'image
    Image1->Refresh();
    A+
    Flo.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 89
    Points : 57
    Points
    57
    Par défaut
    oui c'est compris, merci
    seulement, ça ne marche pas pour une image jpg
    est-ce que tu connais le code du programme qui convertit les images jpg en nuance de gris?
    et encore merci

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Août 2004
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2004
    Messages : 152
    Points : 70
    Points
    70
    Par défaut
    Si tu utilises un composant TJPEG tu peux la convertir en TBtimap pour que ça fonctionne...

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 89
    Points : 57
    Points
    57
    Par défaut
    Merci de ton aide mais je ne sais pas comment faire pour la convertir
    Merci de bien vouloir m'expliquer

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Août 2004
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2004
    Messages : 152
    Points : 70
    Points
    70
    Par défaut
    Tu dois procéder ansi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //Création de ton TJPEG
    ...
     
    //Création du bitmap pour la nuance
    Graphics::TBitmap *bmp = new Graphics::TBitmap;
    bmp->Assign(TJpeg);
    delete TJpeg;
     
    //Nuance ...
    Ce sujet m'intéresse aussi...
    Flo tu pourrais juste me dire comment tu ferais pour prendre la couleur d'un pixel et de le copier sur un pixel d'une autre image ?

  10. #10
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 390
    Points : 1 777
    Points
    1 777
    Par défaut
    Salut !

    Il me semble que le bon rapport luminance/chrominance est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    niv_de_gris = ((R * 30) + (G * 59) + (B * 11)) / 100;
    Mais parfois on a intérêt à utiliser d'autres contrastes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    niv_de_gris = ((R * 25) + (G * 50) + (B * 25)) / 100;
    Le 3/3 .... pourquoi pas !

    A plus !

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 89
    Points : 57
    Points
    57
    Par défaut
    On dirait que tu es un infographiste, tu pourrai bien me donner la définition de la luminance et la chrominance.
    Merci pour ton aide

  12. #12
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    henderson: J'ai à peu près les mêmes valeurs que toi pour la conversion.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int Gray = ( (R*77 + G*150 + B*28) / (255) );

    tlemcenvisit: Pour des définitions va sur le site
    http://www.granddictionnaire.com

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

Discussions similaires

  1. Conversion d'une image en mode RGB en une image en niveau de gris
    Par frisou65 dans le forum Calcul scientifique
    Réponses: 9
    Dernier message: 15/02/2012, 18h20
  2. Conversion d'une image en niveau de gris
    Par bouki' dans le forum Débuter
    Réponses: 2
    Dernier message: 06/10/2010, 20h39
  3. Réponses: 0
    Dernier message: 14/04/2010, 14h40
  4. modification de nuance de gris de image
    Par Invité dans le forum Traitement d'images
    Réponses: 2
    Dernier message: 30/05/2008, 19h01
  5. Réponses: 1
    Dernier message: 30/11/2005, 18h12

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