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 :

Histogramme d'une image BMP en niveaux de gris?


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de bahiatoon
    Inscrit en
    Juillet 2006
    Messages
    169
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juillet 2006
    Messages : 169
    Par défaut Histogramme d'une image BMP en niveaux de gris?
    Salut à tous ,
    si il y'a une personne entre vous qui a implémenté le programme qui donne l'histogramme d'une image BMP en niveaux de gris je lui serai reconnaissante si elle me l'explique car je n'arrête pas d'essayer et je ne trouve toujours rien
    merci par anticipation

  2. #2
    Membre chevronné 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
    Par défaut
    Salut
    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
     
    #include <algorithm>
     
    // buffer pour stocker l'histogramme
    unsigned int histo[256];
     
    // on met ce buffer tout à 0
    std::fill(histo, histo + 256, 0);
     
    // on recupère le bitmap à partir de l'image dont on veut faire l'histogramme*
    // (pour éviter de se trainer le "Image1->Picture->")
    Graphics::TBitmap * bmp = Image1->Picture->Bitmap;
     
    // on parcourt chaque ligne de l'image
    for(int y = 0; y < bmp->Height; y++)
    {
               // on récupère un pointeur sur le 1er pixel de la ligne
               // (attention c'est pour des bitmaps 24 bits donc chaque pixel est un triplet BGR)
               unsigned char * bgr = (unsigned char*)bmp->ScanLine[y];
     
               // on parcourt chaque pixel de la ligne
               // (on va donc de 3 bytes en 3 bytes (de triplet BGR en triplet BGR)
               for(int x = 0; x < bmp->Width; x++, bgr += 3)
                      // on incrémente de 1 dans l'histo pour le niveau de gris correspondant 
                      // (en l'occurence on regarde la composante bleue)
                      histo[ *bgr ]++; 
    }
    Voilà, c'est pas testé et fait de tête donc n'hésite pas à répondre si y a une erreur. En outre ce code fonctionne pour des bmp en niveau de gris mais codés sur 24 bits. Si ton format est du 8 bits tu feras

    au lieu de


    Si tu as encore un autre format dis nous lequel.

    Flo.

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 42
    Par défaut ça marche ?
    Bonjour à tous.

    Quelqu'un peut-il me confirmer que cette fonction marche ?

    Moi j'ai le code suivant:

    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
    void ConstruitHistogramme(tImage *img, tHistogramme *histo)
    {
        int x, y,i,n;
        unsigned char * pix;
     
        histo->nbPixels = (img->dimX) * (img -> dimY);
        histo-> NInf=0;
        histo-> NSup=255;
     
        for(i=0;i<255;i++) 
        {
                histo->buffer[i]=0;
        }
     
     
        for(y=0;y<(img->dimY);y++)
          { 
     
                for(x=0;x<(img->dimX);x++,pix+=3)
                { 
                        pix=getPixel(x,y,img);
                        histo->buffer[*pix]++;
     
                }
          }
     
        histo-> niveauMoyen=((histo-> NInf) + (histo-> NSup))/2;	// Niveau de gris moyen
     
    }
    Avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    unsigned char* getPixel(int x,int y, tImage *src)
    {
             unsigned char* pixel;
             pixel= (unsigned char*) (src->buffer + (y * (src->dimY)) + x);
             return pixel;         
    }
    Merci de toute réponse. Bonne journée!

  4. #4
    Membre Expert

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Pas d'accord pour le bitmap 8 bits (au sens où il faut faire attention) !
    Dans ce que l'on montre on fait l'histogramme des index et non des niveaux de gris !
    L'algo est valable uniquement si on a la certitude que : index = R = G = B dans toute la portée de la boucle ce qui revient à avoir une palette dont les teintes y sont stockées dans cet ordre !

    C'est au cas où ... en fonction du contexte dans lequel on développe cet algo !!!

    Utiliser :
    - le type Byte en lieu et place de unsigned char !
    - ZeroMemory(Buffer, 256) pour le RAZ de l'histogramme !

    A plus !

  5. #5
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 42
    Par défaut ..à voir...
    Citation Envoyé par henderson Voir le message
    Salut !

    Pas d'accord pour le bitmap 8 bits (au sens où il faut faire attention) !
    Dans ce que l'on montre on fait l'histogramme des index et non des niveaux de gris !
    L'algo est valable uniquement si on a la certitude que : index = R = G = B dans toute la portée de la boucle ce qui revient à avoir une palette dont les teintes y sont stockées dans cet ordre !

    Utiliser :
    - le type Byte en lieu et place de unsigned char !
    - ZeroMemory(Buffer, 256) pour le RAZ de l'histogramme !

    A plus !
    Salut et merci pour ta réponse.
    Il est vrai que j'ai oublié de préciser que je travail sur des images BMP 24 bits et sur des niveaux de gris uniquement pour l'instant. Je commence juste à apprendre le traitement d'images.

    Pour l'instant l'erreur que j'obtenais c'est que mon buffer de l'histogramme ne contenait pas 256 niveaux de gris...

    Je vais en tout cas prendre en considération ta réponse et je te redirai ce qu'il en est...

    Merci et bonne journée!

  6. #6
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 42
    Par défaut
    Re bonjour! J'ai donc suivi tes conseils et voici ma nouvelle version:

    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 ConstruitHistogramme(tImage *img, tHistogramme *histo)
    {
        int x, y,i;
        int total=0;
        byte* pix;
     
        histo->nbPixels =(img->dimX) * (img -> dimY);
        histo-> NInf=0;
        histo-> NSup=255;
     
        ZeroMemory(histo->buffer, 256);
     
        for(y=0;y<(img->dimY);y++)
          { 
     
                for(x=0;x<(img->dimX);x++)
                { 
                        pix=getPixel(x,y,img);
                        histo->buffer[*pix]++;
                        if((histo->buffer[*pix])< (histo->NInf))
                        {
                                  histo->NInf=histo->buffer[*pix];
                        }
                        if((histo->buffer[*pix])> (histo->NSup))
                        {
                                  histo->NSup=histo->buffer[*pix];
                        }
                        total += histo->buffer[*pix];   
                }
          }
     
        histo-> niveauMoyen= total / histo->nbPixels;	// Niveau de gris moyen
     
    }
    malheureusement, j'obtiens toujours la même erreur qui me signale que mon mon histogramme ne contient pas 256 niveaux de gris. Si quelqu'un arrive à savoir pourquoi ce code ne fonctionne pas je serai ravi de lire ses suggestions.

    Merci pour toute réponse et bonne fin de journée !

Discussions similaires

  1. Comment convertir une image RGB en niveaux de gris ?
    Par Imène_23 dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 07/08/2011, 14h50
  2. Histogramme d'une image BMP - Où mon code cloche-t-il?
    Par Killerboy dans le forum Débuter
    Réponses: 4
    Dernier message: 15/07/2009, 17h53
  3. [C#] Comment convertir une image bmp en jpg !!!
    Par vandeyy dans le forum Windows Forms
    Réponses: 5
    Dernier message: 13/07/2004, 20h37
  4. inserer une image BMP dans un fichier rtf
    Par Alice9 dans le forum MFC
    Réponses: 17
    Dernier message: 06/07/2004, 10h31
  5. [BPW] Impression d'une image BMP
    Par Alcatîz dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 21/08/2003, 14h34

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