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 :

Charger une image et appliquer un filtre


Sujet :

C++Builder

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    3
    D�tails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 3
    Par d�faut Charger une image et appliquer un filtre
    Bonjour, je suis d�butant en c++ builder et je souhaiterai �tablir un programme qui charge une image puis lui appliqu�e un filtre par le biais d'un produit de convolution. j'ai pu r�alis� les premi�res �tapes mes au niveau du produit de convolution sa bloque, en plus je re�ois des messages d'erreurs E2015 au niveau de "Image1[][]" qui dit: "Ambiguity between 'TComponent::operator IInterfaceComponentReference*()' and 'Tcomponent::operator IInterface*()'".

    Je vous �crit le code c++ et j'esp�re que quelqu'un d'entre vous puisse m'aider � r�soudre le probl�me. merci d'avance
    cordialement

    Le code c++
    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
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    //---------------------------------------------------------------------------
     
    #include <vcl.h>
    #pragma hdrstop
     
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
     
     
    void __fastcall TForm1::OuvrirClick(TObject *Sender)
    {
    this->OpenPictureDialog1->Execute();
    Image1->Picture->LoadFromFile(this->OpenPictureDialog1->FileName);
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::LectureClick(TObject *Sender)
    {
    int l,c;
    int** image1;
    //Lecture
    l=Image1->Height;
    c=Image1->Width;
    image1=new int*[l];
    for (int x=0 ; x<=l; x++)
    image1[x]=new int [c];
     
          //niveau gris
          for (int x=0 ; x<=l; x++){
          for (int y=0 ; y<=c; y++){
     
             int r,v,b,g;
     
             r=GetRValue(this->Image1->Canvas->Pixels [x][y]);
             v=GetGValue(this->Image1->Canvas->Pixels [x][y]);
             b=GetBValue(this->Image1->Canvas->Pixels [x][y]);
             g=div(r+v+b,3).quot;
             image1[x][y]=g;
     
                   }
          }
     
     
          //Affichage
     
           this->StringGrid1->ColCount=c;
           this->StringGrid1->RowCount=l;
           for (int x=0 ; x<=l; x++){
           for (int y=0 ; y<=c; y++){
           this->StringGrid1->Cells [x][y]=image1[x][y];
           }
           }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FiltreClick(TObject *Sender)
    {
     int** filt;
    //Lecture
    filt=new int*[3];
    for (int i=0 ; i<=3; i++)
    filt[i]=new int [3];
    //Affichage
     
           this->StringGrid2->ColCount=3;
           this->StringGrid2->RowCount=3;
           for (int i=0 ; i<=3; i++){
           for (int j=0 ; j<=3; j++){
           this->StringGrid2->Cells [0][0]=1;
           this->StringGrid2->Cells [0][1]=0;
           this->StringGrid2->Cells [0][2]=-1;
           this->StringGrid2->Cells [1][0]=1;
           this->StringGrid2->Cells [1][1]=0;
           this->StringGrid2->Cells [1][2]=-1;
           this->StringGrid2->Cells [2][0]=1;
           this->StringGrid2->Cells [2][1]=0;
           this->StringGrid2->Cells [2][2]=-1;
           }
           }
           for (int i=0 ; i<=3; i++){
           for (int j=0 ; j<=3; j++){
     
           this->StringGrid2->Cells [i][j] = filt[i][j];
    }
    }
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::ConvolutionClick(TObject *Sender)
    {
    int h,w,t1,t2;
    int** conv,filt;
     
    h=Image1->Height;
    w=Image1->Width;
    conv=new int*[h];
    for (int x=0 ; x<=h; x++)
    conv[x]=new int [w];
     
    // Produit de convolution
     for (int x=1 ; x<=h-1; x++){
           for (int y=1 ; y<=w-1; y++){
            t1=filt[0][0]*Image1[x-1][y-1]+filt[0][1]*Image1[x-1][y]+filt[0][2]*Image1[x-1][y+1]+filt[1][0]*Image1[x][y-1]+filt[1][1]*Image1[x][y]+filt[1][2]*Image1[x][y+1]+filt[2][0]*Image1[x+1][y-1]+filt[2][1]*Image1[x+1][y]+filt[2][2]*Image1[x+1][y+1];
            t2=div(t1,9).quot;
            conv[x][y]=t2;
            }
     }
     
    // affichage
     
     for (int x=0 ; x<=h; x++){
           for (int y=0 ; y<=w; y++){
            this->Image2->Canvas->Pixels [x][y];
            }
            }
    }
    //---------------------------------------------------------------------------

  2. #2
    Expert confirm�

    Avatar de pottiez
    Homme Profil pro
    D�veloppeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activit� : D�veloppeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par d�faut
    Salut,
    Image1 est un TImage, et si c'est bien aux pixels que tu veut acc�der en faisant [][] alors il faut que tu utilise la propri�t� Pixel du canvas, comme tu l'as fait p�ur ton Image2

    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::ConvolutionClick(TObject *Sender)
    {
       int h,w,t1,t2;
       int** conv,filt;
     
       h=Image1->Height;
       w=Image1->Width;
       conv=new int*[h];
       for (int x=0 ; x<=h; x++)
         conv[x]=new int [w];
     
    // Produit de convolution
        for (int x=1 ; x<=h-1; x++){
                for (int y=1 ; y<=w-1; y++){
                   t1=filt[0][0]*Image1->Canvas->Pixel[x-1][y-1]+filt[0][1]*Image1->Canvas->Pixel[x-1][y]+filt[0][2]*Image1->Canvas->Pixel[x-1][y+1]+filt[1][0]*Image1->Canvas->Pixel[x][y-1]+filt[1][1]*Image1->Canvas->Pixel[x][y]+filt[1][2]*Image1->Canvas->Pixel[x][y+1]+filt[2][0]*Image1->Canvas->Pixel[x+1][y-1]+filt[2][1]*Image1->Canvas->Pixel[x+1][y]+filt[2][2]*Image1->Canvas->Pixel[x+1][y+1];
                   t2=div(t1,9).quot;
                   conv[x][y]=t2;
                 }
        }
     
       // affichage
     
        for (int x=0 ; x<=h; x++){
                for (int y=0 ; y<=w; y++){
                   this->Image2->Canvas->Pixels [x][y];
                 }
               }
    }
    PS : Ajoute des parenth�ses � ton calcule, �a ne fait pas de mal et �a �vite des erreurs b�tes

  3. #3
    Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    3
    D�tails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 3
    Par d�faut
    Merci de m'avoir aider, autre chose je souhaiterai savoir comment faire la conversion matrice->image et vis versa.

  4. #4
    Membre Expert

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 412
    Par d�faut
    Salut !

    En mati�re de traitement d'images il faut toujours privil�gier le temps d'ex�cution au temps de d�veloppement !
    TCanvas::Pixels est certes tr�s pratique d'emploi mais excessivement p�nalisant au niveau temps d'ex�cution.
    Les probl�mes seraient r�solus en travaillant avec des bitmaps au lieu des tableaux qui ne doivent �tre mis en lice que pour des calculs interm�diaires.
    Pour acc�der directement aux compsantes RGB des pixels il suffit de :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class jRgb
    {
    public :
    Byte b;
    Byte g;
    Byte r;
    };
    Et d'utiliser TBitmap::ScanLine !

    Voici un exemple de conversion en gris argentique.
    Srce est le bitmap dans lequel est stock�e l'image.
    Dest est un bitmap dans lequel sera stock�e l'image convertie en niveau de gris.
    Ces deux bitmaps ont leur propri�t� PixelFormat fix� � pf24bit.

    Graphics::TBitmap *Srce;
    Graphics::TBitmap *Dest;
    Srce et Dest peuvent �tre des bitmaps isol�s ou bien �tre ceux de leur TImage !
    Au quel cas on aurait (par exemple) :

    Graphics::TBitmap *Srce = Image1->Picture->Bitmap;
    Graphics::TBitmap *Dest = Image2->Picture->Bitmap;
    Voici la conversion :

    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
     
    jRgb *S, *D;
    int y, x, g;
     
    Dest->Width = Srce->Width;
    Dest->Height = Srce->Height;
     
    for(y=0; y < Dest->Height; y++)
        {
        S = (jRgb*)Srce->ScanLine[y]; // ligne des pixels source
        D = (jRgb*)Dest->ScanLine[y]; // ligne des pixels de destination
        for(x = 0; x < Dst->Width; x++)
            {
            g = ((S[x].r * 30) +
                 (S[x].g * 59) +
                 (S[x].b * 11)) / 100;
            //REM : dans un 24 bits: R = G = B = niveau de gris 
            D[x].r = (Byte)g ;
            D[x].g = (Byte)g ;
            D[x].b = (Byte)g ;
            }
        }
    Si Dest est le bitmap d'un TImage, il suffira de faire :

    Si Dest est un bitmap isol�, on peut le dessiner directement sur une form � un emplacement quelconque :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    Canvas->Draw(0, 0, Dest);
    Il y a pas mal de discussions sur ScanLine sur ce forum donc ...

    A plus !

  5. #5
    Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    3
    D�tails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 3
    Par d�faut
    Bonjour, merci pour vos r�ponse.
    je souhaiterai savoir comment faire la conversion matrice->image et vis versa.

  6. #6
    Membre �m�rite Avatar de b_reda31
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Avril 2007
    Messages
    899
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : Alg�rie

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 899
    Par d�faut
    Une partie de ce post traite le chargement d'une image dans une matrice et vis versa.

Discussions similaires

  1. charger une image avec Jframe
    Par Battosaiii dans le forum Agents de placement/Fen�tres
    R�ponses: 10
    Dernier message: 15/12/2005, 15h35
  2. Charger une image dans un thread
    Par KRis dans le forum Langage
    R�ponses: 3
    Dernier message: 25/08/2005, 17h36
  3. Charger une image
    Par Andy_24DB dans le forum Java ME
    R�ponses: 1
    Dernier message: 30/06/2005, 22h56
  4. [Image]comment pre-charger une image
    Par al85 dans le forum 2D
    R�ponses: 5
    Dernier message: 28/02/2005, 20h22
  5. R�ponses: 13
    Dernier message: 19/11/2004, 18h11

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