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

  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 420
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 420
    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 : 42
    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.

  7. #7
    Membre Expert
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Par d�faut
    Mise � part la solution que ta propos� henderson, qui est la plus efficace. Pour te permettre de commencer, je te donne ce code :

    Lecture de l'image et la mettre dans une matrice :
    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
     
    // Déclaration des variables
    int H = Image1 -> Picture -> Height,
        W= Image1 -> Picture -> Width ; 
     
    int **ImSourceR = new int*[H] ;
    int **ImSourceG = new int*[H] ;
    int **ImSourceB = new int*[H] ;
     
    for(int i = 0 ; i < H ; i++)
          {
             ImSourceR[i] = new int[W] ;
             ImSourceG[i] = new int[W] ;
             ImSourceB[i] = new int[W] ;
           }   
     
    // Lecture de l'image et la mettre dans la matrice
    for(int i = 0 ; i < H ; i++)
       for(int j = 0 ; j < W ; j++)
          {
             ImSourceR[i][j] = GetRValue(Image1 -> Canvas -> Pixels[j][i]);
             ImSourceG[i][j] = GetGValue(Image1 -> Canvas -> Pixels[j][i]);
             ImSourceB[i][j] = GetBValue(Image1 -> Canvas -> Pixels[j][i]);
            }

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