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 :

résultat binarisation d'image


Sujet :

C++Builder

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2011
    Messages : 14
    Points : 9
    Points
    9
    Par défaut résultat binarisation d'image
    j'ai programmer une code de binarisation d'une image bitmap sous builder c++6 mais le résultats n'est pas comme je le veux et 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    void __fastcall TForm1::Binarisation1Click(TObject *Sender)
    {
       Graphics::TBitmap* Image;
       Image = new Graphics::TBitmap();
       Image->Height = Image1->Picture->Height;
       Image->Width = Image1->Picture->Width;
     
       StringGrid1->RowCount = Image->Height;
       StringGrid1->ColCount = Image->Width;
     
       for (int j = 1; j <=Image1->Picture->Width ; j++)
         Image->Canvas->Pixels[i][j] = RGB( (int) GetRValue(ColorToRGB(Image1->Canvas->Pixels[i][j])), (int) GetRValue(ColorToRGB(Image1->Canvas->Pixels[i][j])), (int) GetRValue(ColorToRGB(Image1->Canvas->Pixels[i][j])));
         if(Image->Canvas->Pixels[i][j] <= 128)
         {
          StringGrid1->Cells[j][i] = 0;
          Image->Canvas->Pixels[i][j] = RGB( (int) GetRValue(ColorToRGB(0)), (int) GetRValue(ColorToRGB(0)), (int) GetRValue(ColorToRGB(0)));;
         }
         else
         {
           StringGrid1->Cells[j][i] = 255;
           Image->Canvas->Pixels[i][j] = RGB( (int) GetRValue(ColorToRGB(255)), (int) GetRValue(ColorToRGB(255)), (int) GetRValue(ColorToRGB(255)));
         }
        for (int i = 1; i <=Image1->Picture->Height ; i++)
        {
        }
                                                   Image2->Picture->Bitmap->Assign(Image);
    }

    je ne sais pas ou est l'erreur. svp aider moi

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 612
    Points : 25 303
    Points
    25 303
    Par défaut


    Ah, enfin, tu proposes du code !
    Bon tu demandes où est l'erreur, je dirais plutôt, où est-ce qu'il n'y a pas d'erreur !

    Manque des Accolades, boucle écrite n'importe comment, tu ne comprend même pas ce que tu as pondu, cela ne compile même pas !

    je sais que mes réponses on été modéré, je t'avais écrit l'algo

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    pour chaque colonne c
    debut
      pour chaque ligne l
      debut
        si pixels[c, l].Canal.Bleu > seuil alors
          pixels[c, l].Canal.Bleu
        si pixels[c, l].Canal.Rouge > seuil alors
          pixels[c, l].Canal.Rouge 
        si pixels[c, l].Canal.Vert > seuil alors
          pixels[c, l].Canal.Vert
      fin
    fin

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2011
    Messages : 14
    Points : 9
    Points
    9
    Par défaut resultat de binarisation
    mon image est au niveau de gris je lis pour chaque pixel et j'ai une seuil=15 si pixel[i][j]<=seuil alors pixel[i][j]=0 sinon pixel[i][j]=255

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 612
    Points : 25 303
    Points
    25 303
    Par défaut
    pourquoi deux réponses ?
    la balise code c'est uniquement pour le code, cela permet de conserver l'indentation d'un code ou d'un algo, a utiliser au bon moment !

    Le problème n'est pas la gestion du seuil, c'est l'imbrication des boucles !
    Tu n'as pas compris ce qu'était un Niveau de Gris dans un TBitmap en RVB

    tu n'es pas loin d'un résultat !
    Poursuit les efforts !

    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
    pour chaque colonne c
    debut
      pour chaque ligne l
      debut    
        si pixels[c, l].Canal.Bleu est différent de pixels[c, l].Canal.Rouge
        ou si pixels[c, l].Canal.Bleu est différent de pixels[c, l].Canal.Vert
        ou si pixels[c, l].Canal.Rouge est différent de pixels[c, l].Canal.Vert
        alors 
          pixels[c, l].Canal.Bleu = (pixels[c, l].Canal.Bleu + pixels[c, l].Canal.Rouge + pixels[c, l].Canal.Vert) / 3
        finsi       
     
        si pixels[c, l].Canal.Bleu > seuil alors    
          pixels[c, l].Canal.Bleu = 255 
        sinon
          pixels[c, l].Canal.Bleu = 0 
        finsi
     
        pixels[c, l].Canal.Rouge = pixels[c, l].Canal.Bleu
        pixels[c, l].Canal.Vert = pixels[c, l].Canal.Bleu 
      fin
    fin
    tu utilises les macros de wingdi, c'est bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #define GetRValue(rgb)      (LOBYTE(rgb))
    #define GetGValue(rgb)      (LOBYTE(((WORD)(rgb)) >> 8))
    #define GetBValue(rgb)      (LOBYTE((rgb)>>16))
    Mais, il y a nettement plus rapide, pourquoi faire des opérations de décalage de bit en RunTime alors que l'on peut le faire à la compilation !

    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
    typedef struct
    {
      union
      {
        struct
        {
          TColor Color;
        };
        struct
        {
          Byte R;
          Byte V;
          Byte B;
          Byte A;
        };
      };
     
    } TRGBColor;

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2011
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    moi j'ai fais l'éxecution j'ai pas des erreurs mais j'ai pas une image binarisé le résultat est une image blanc et un point noir je sais pas pourquoi.

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 612
    Points : 25 303
    Points
    25 303
    Par défaut
    Tu plaisantes ? Pas avec le code fourni !
    Celui là ne compile pas !
    for sans {
    utilisation de i avant sa déclaration ! ou alors tu un autre i déclaré en global avant !

    sinon, ton explication du code est correct, et c'est ce que fait ton code, ta boucle tourne dans le vide
    tu ne modifie qu'un seul pixel effectivement, tu devrais apprendre les bases du C++ comme le for, le if, les {}, la gestion de portée de déclaration dans un bloc...
    Après, une fois que tu connaitras les bases, tu pourras t'attaquer à ce type de calcul, certe basique mais qui demande un minimum de maitrise du langage !

    Tient, voici un code tout à fait convenable !

    Code pascal : 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
     
    type
      TRGBColor = record
        case boolean of
          True:
          (
            Color: TColor 
          );
          False:
          (
            R, V, B, A: Byte;
          );
      end;
     
     
    procedure TForm1.Binarisation1Click(Sender: TObject)
    var
      x: Integer;
      y: Integer;
      NumColor: TRGBColor;
    begin
      with Image1 do
       begin
        for x := 0 to Picture.Width -1 do // -1 ou pas, je sais jamais !
        begin
          for y := 0 to Picture.Height -1 do
          begin
            NumColor.Color := Canvas.Pixels[x, y];
            if ((NumColor.R <> NumColor.V) or (NumColor.R <> NumColor.B) or (NumColor.V <> NumColor.B))
              NumColor.R := IfThen((NumColor.R + NumColor.V + NumColor.B) div 3 > 128, 255, 0)
            else
              NumColor.R := IfThen(NumColor.R > 128, 255, 0);
     
            NumColor.V := NumColor.R;
            NumColor.B := NumColor.R;
            Canvas.Pixels[x, y] := NumColor.Color;
          end;
        end;
      end;
    end;

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2011
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    est ce que je peux envoyer mon application et tu le voix pour me dite où est le pbm.

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 612
    Points : 25 303
    Points
    25 303
    Par défaut
    Je ne suis pas là pour faire ton devoir !
    Tu DOIS trouvé toute seule !
    Essaye de comprendre un peu plus !
    J'ai fourni un Algo et sa mise en oeuvre en Delphi, c'est pas difficile d'essayer de comprendre et faire une version C++

  9. #9
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2011
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    ça c'est mon application svp voir le.merci
    Fichiers attachés Fichiers attachés

  10. #10
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 612
    Points : 25 303
    Points
    25 303
    Par défaut
    Le code du RAR est nettement mieux !

    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
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Binarisation1Click(TObject *Sender)
    {
       Graphics::TBitmap* Image;
       Image = new Graphics::TBitmap();
       Image->Height = Image1->Picture->Height;
       Image->Width = Image1->Picture->Width;
     
       StringGrid1->RowCount = Image->Height;
       StringGrid1->ColCount = Image->Width;
     
       for (int j = 1; j <=Image1->Picture->Width ; j++)
        for (int i = 1; i <=Image1->Picture->Height ; i++)
        {
         Image->Canvas->Pixels[i][j] = RGB( (int) GetRValue(ColorToRGB(Image1->Canvas->Pixels[i][j])), (int) GetRValue(ColorToRGB(Image1->Canvas->Pixels[i][j])), (int) GetRValue(ColorToRGB(Image1->Canvas->Pixels[i][j])));
         if(Image->Canvas->Pixels[i][j] <= 128)
         {
          StringGrid1->Cells[j][i] = 0;
          Image->Canvas->Pixels[i][j] = RGB( (int) GetRValue(ColorToRGB(0)), (int) GetRValue(ColorToRGB(0)), (int) GetRValue(ColorToRGB(0)));;
         }
         else
         {
           StringGrid1->Cells[j][i] = 255;
           Image->Canvas->Pixels[i][j] = RGB( (int) GetRValue(ColorToRGB(255)), (int) GetRValue(ColorToRGB(255)), (int) GetRValue(ColorToRGB(255)));
         }
        }
                                                   Image2->Picture->Bitmap->Assign(Image);
    }

    une seule ligne à corriger !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(Image->Canvas->Pixels[i][j] <= 128)
    Cela nécessite de comprendre le TColor et la notion de RVB, savoir ce que faisait GetRValue que tu utilise n'importe comment et sans comprendre puisque tu l'utilise pas au moment où il faut et que l'utilise quand c'est inutile !

    simplification

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      StringGrid1->Cells[j][i] = 0;
      Image->Canvas->Pixels[i][j] = clWhite;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      StringGrid1->Cells[j][i] = 255;
      Image->Canvas->Pixels[i][j] = clBlack;
    Code totalement inutile

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
         Image->Canvas->Pixels[i][j] = RGB( (int) GetRValue(ColorToRGB(Image1->Canvas->Pixels[i][j])), (int) GetRValue(ColorToRGB(Image1->Canvas->Pixels[i][j])), (int) GetRValue(ColorToRGB(Image1->Canvas->Pixels[i][j])));

  11. #11
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2011
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    je suis désolé pour ces questions

  12. #12
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 612
    Points : 25 303
    Points
    25 303
    Par défaut
    Quelle Question ?
    Tu ne poses pas de question, tu attends que l'on te fournisse un code !

    Moi, je soulève des problèmes que tu dois résoudre !
    tu n'es pas loin d'un résultat, faut juste changer 128 en une autre valeur, 128 c'est une valeur pour un seul canal, un TColor c'est 3 canaux R, V et B plus la Transparence !
    La Solution étant 808080 ! mais qu'est ce que 808080 par rapport à 128 !

  13. #13
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2011
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    j’essaye d'appliquer tes conseil et je te donne une réponse. merci

  14. #14
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    Salut,
    Le traitement d'image que tu a posté comporte plusieurs erreurs:
    1. confusion entre les valeurs de chrominance RGB Codées de 0.. 255 soit 256 valeurs
    2. Parcour des pixels de l'image erroné, les listes de la VCL démarrent toujours de 0 à n-1 -> ainsi dans ton code la première ligne ,respectivement colonne est oubliée

    Il existe un autre possibilité en calculant la valeur de la luminance de chaque pixel en utilisant la formule suivante
    Y=.299*R + .587*G + .114*B;
    ton code devient alors
    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 __fastcall TForm1::Binarisation1Click(TObject *Sender)
    {
       Graphics::TBitmap* Image;
       Image = new Graphics::TBitmap();
       Image->Height = Image1->Picture->Height;
       Image->Width = Image1->Picture->Width;
     
       StringGrid1->RowCount = Image->Height;
       StringGrid1->ColCount = Image->Width;
       unsigned char R,G,B;
       TColor Value;
       float Y;
       for (int j = 0; j <Image1->Picture->Width ; j++)
    	for (int i = 0; i <Image1->Picture->Height ; i++)
    	{
    	 Value=ColorToRGB(Image1->Canvas->Pixels[i][j]);
    	 R=GetRValue(Value);
    	 G=GetGValue(Value);
    	 B=GetBValue(Value);
    	 Y=.299*R + .587*G + .114*B;
    	 StringGrid1->Cells[j][i] =Value ;
    	 if(Y<128)   // milieu de l'échelle du gris
    		Image->Canvas->Pixels[i][j] =clBlack;
    	 else
    	   Image->Canvas->Pixels[i][j] = clWhite;
    	}
       Image2->Picture->Bitmap->Assign(Image);
    }


    cordialement

Discussions similaires

  1. Binariser une image RVB sur la couleur rouge
    Par deathsceythe dans le forum OpenCV
    Réponses: 0
    Dernier message: 25/09/2008, 21h53
  2. Binariser une image segmentée avec watershed
    Par miss_angel dans le forum Images
    Réponses: 3
    Dernier message: 30/04/2008, 15h34
  3. Seuillage pour binarisation d'image
    Par zolotaya dans le forum Traitement d'images
    Réponses: 26
    Dernier message: 10/05/2007, 14h35
  4. Binarisation d'image pour détection de formes
    Par babarpapa dans le forum Traitement d'images
    Réponses: 12
    Dernier message: 09/05/2006, 15h32

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