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 :

Image en niveau de gris


Sujet :

C++Builder

  1. #1
    Membre habitué Avatar de SteelBox
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2002
    Messages : 446
    Points : 194
    Points
    194
    Par défaut Image en niveau de gris
    Bonjour,
    j'ai lu que pour passer une image couleur (24 bits dans mon cas) à un niveau de rgsi, il suffisait de faire la moyenne des 3 composantes;
    C'est ce que j'ai fait mais je n'obtiens pas le résultat souhaite, pourquoi ?
    Voici mon 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
     
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
            int NbBytes=1;
            int i,j,k,l;
            TColor coul,pix;
            for (i=0; i<imageData->Height; i++)
            {
     
                    for (j=0; j<imageData->Width; j++)
                    {
                            pix=imageData->Canvas->Pixels[i][j];
                            coul=((pix&0x000000FF)+(pix&0x0000FF00)+(pix&0x00FF0000))/3;
                            Image1->Canvas->Pixels[i][j]=coul;
                    }
            }
    }
    Au passage, si quelqu'un sait comment binariser l'image...
    Merci
    La vitesse de la lumière étant supérieure à celle du son, il apparaît normal que beaucoup de gens paraissent brillants jusqu'à ce qu'ils l'ouvrent.

  2. #2
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Mai 2002
    Messages : 84
    Points : 109
    Points
    109
    Par défaut
    Bonjour,

    Ta moyenne n'est pas bonne.
    Il faut ramener chaque composante couleur à sa valeur entiére, faire la moyenne et affecter cette moyenne à chaque composante.

    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
     
            int NbBytes=1;
            int i,j,k,l;
            TColor coul,pix;
     
            int iiRed;
            int iiGreen;
            int iiBlue;
     
            LockWindowUpdate(Handle);
     
            for (i=0; i < imageData->Height; i++)
            {
     
                    for (j=0; j < imageData->Width; j++)
                    {
                            pix=imageData->Canvas->Pixels[j][i];
     
                            iiRed = (pix&0x000000FF);
                            iiGreen = (pix&0x0000FF00) >> 8;
                            iiBlue = (pix&0x00FF0000) >> 16;
     
                            coul=(iiRed+iiGreen+iiBlue)/3;
     
                            iiRed = coul;
                            iiGreen = coul << 8;
                            iiBlue = coul << 16;
     
                            coul = iiRed+iiGreen+iiBlue;
                            Image1->Canvas->Pixels[j][i]=coul;
                    }
            }
            LockWindowUpdate(NULL);
    Voila, ici c'est tres "demonstratif" pour que tu comprennes bien, tu peux donc optimiser tout ça.
    Pour info, tu as inversé i et J dans la lecture du Pixel (l'image n'est pas complétement traitée à moins d'avoir un carré!).
    Ensuite il faudrait utiliser ScanLine pour faire le traitement, c'est infiniment plus rapide.
    A ta disposition
    Christophe MERLIER

  3. #3
    ubu
    ubu est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2002
    Messages : 38
    Points : 47
    Points
    47
    Par défaut
    Salut,

    Je rajouterais que faire une moyenne des trois composante RVB ne donne pas des résultats fantastiques.
    D'habitude, on pondére les composantes comme suit:

    R => 30%
    V => 59%
    B => 11%

    Le bleu à beaucoup moins d'importance que les autres composantes.

    Au final, la composante Gris sera la suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    G= (30*R+59*V+11*B)/100;

  4. #4
    Membre habitué Avatar de SteelBox
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2002
    Messages : 446
    Points : 194
    Points
    194
    Par défaut
    Merci pour les infos, j'ai essayé et ca donne un meilleur résultat qu'avant.
    Voici 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
    28
    29
    30
    31
    32
    33
    34
     
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
            int NbBytes=1;
            int i,j,k,l;
            TColor coul,pix;
            int iiRed;
            int iiGreen;
            int iiBlue;
     
            LockWindowUpdate(Handle);
            for (i=0; i<imageData->Width; i++)
            {
                    for (j=0; j<imageData->Height; j++)
                    {
                            pix=imageData->Canvas->Pixels[i][j];
                            //coul=((pix&0x000000FF)+(pix&0x0000FF00)+(pix&0x00FF0000))/3;
                            iiRed = (pix&0x000000FF); 
                            iiGreen = (pix&0x0000FF00) >> 8;
                            iiBlue = (pix&0x00FF0000) >> 16;
     
                            //coul=(iiRed+iiGreen+iiBlue)/3;
                            //G= (30*R+59*V+11*B)/100;
                            coul=(iiRed*30+iiGreen*59+iiBlue*11)/100;
                            iiRed = coul;
                            iiGreen = coul << 8; 
                            iiBlue = coul << 16; 
     
                            coul = iiRed+iiGreen+iiBlue;
                            Image1->Canvas->Pixels[i][j]=coul;
                    }
            }
            LockWindowUpdate(NULL);
    }
    Voici ce que j'obtiens :
    http://winalbest.ifrance.com/winalbest/Sans.jpg

    Y'a t-il moyen d'obtenir un résultat encore meilleur, comme ceux de Paint shop pro ?
    Résultat avec paint shop pro :
    http://winalbest.ifrance.com/winalbest/Image1.jpg
    Merci
    La vitesse de la lumière étant supérieure à celle du son, il apparaît normal que beaucoup de gens paraissent brillants jusqu'à ce qu'ils l'ouvrent.

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

Discussions similaires

  1. allocation dynamique, image et niveau de gris
    Par jbarreau-mainson dans le forum Débuter
    Réponses: 13
    Dernier message: 07/04/2008, 11h33
  2. Réponses: 1
    Dernier message: 08/03/2007, 15h39
  3. image en niveau de gris 16 bits
    Par kekeauboulot dans le forum Delphi
    Réponses: 2
    Dernier message: 16/06/2006, 19h25
  4. Réponses: 1
    Dernier message: 30/11/2005, 17h12
  5. Réponses: 8
    Dernier message: 17/04/2005, 19h58

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