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 :

Problème avec filtre moyenneur "flou uniforme" d’une image


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de SmileSoft
    Inscrit en
    Mars 2008
    Messages
    436
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 436
    Par défaut Problème avec filtre moyenneur "flou uniforme" d’une image
    Salut


    Je dois filtrer une image bitmap en niveau de gris par un filtre moyenneur (flou uniforme),vous pouvez voir le résultat de ce filtre dans ce lien: http://xphilipp.developpez.com/artic...s/?page=page_4

    Quand j’ai exécuté mon code l’image en résultat été défectueuse.
    mon code du filtre moyenneur est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     for(i=0;i<=Form1->Image1->Picture->Height-1;i++)
      {
     for( j=0;j<=Form1->Image1->Picture->Width-1;j++)
        {
     Form1->Image2->Canvas->Pixels[i][j]=(Form1->Image1->Canvas->Pixels[i-1][j-1]+Form1->Image1->Canvas->Pixels[i-1][j]+Form1->Image1->Canvas->Pixels[i-1][j+1]+ Form1->Image1->Canvas->Pixels[i][j-1]+ Form1->Image1->Canvas->Pixels[i][j]+Form1->Image1->Canvas->Pixels[i][j+1]+Form1->Image1->Canvas->Pixels[i+1][j-1]+Form1->Image1->Canvas->Pixels[i+1][j]+Form1->Image1->Canvas->Pixels[i+1][j+1])/9;
        }
        }
    je vous joins le résultat de cette exécution comme une image.

    Est ce que quelqu'un peut m'explique pourquoi j'ai pas eu le même résultat qui est donné sur le lien si dessus ??

    Merci d'avance.

  2. #2
    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 !

    Pour une raison très simple, en supposant que l'on travaille sur des bitmaps 24 bits,
    - il te faut extraire un composante et une seule, puisque un niveau de gris c'est : R=G=B
    - faire la moyenne sur les 9 points
    - recomposer la teinte qui correspond au niveau de gris (le résultat de la moyenne des 9 points pour R, G et B)
    La plus simple à extraire de (TColor) Couleur est la première (le bleu il me semble) avec un masque : 0xFF

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    TCanvas *C1 = Image1->Picture->Bitmap->Canvas;
    TCanvas *C2 = Image2->Picture->Bitmap->Canvas;
    Byte r;
     
    ...
     
        r = (Byte)(((C1->Pixels[x-1][y-1] & 0xFF) +
                    ...
                    ...
                    (C1->Pixels[x+1][y+1] & 0xFF)) / 9);
     
        C2->Pixels[x][y] = (TColor)(RGB(r,r,r));
    ...
    Si on est dans le contexte des bitmaps 8 bits... alors ça risque de se compliquer si on n'obtient toujours pas le résultat escompté !!!

    Par ailleurs... si la rapidité du traitement a une importance, dans ce cas il faudra utiliser TBitmap::ScanLine.

    A plus !

  3. #3
    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
    Bonjour,
    r = (Byte)(((C1->Pixels[x-1][y-1] & 0xFF) +
    ...
    ...
    (C1->Pixels[x+1][y+1] & 0xFF)) / 9);

    C2->Pixels[x][y] = (TColor)(RGB(r,r,r));
    Il est aussi possible d'obtenir une composante (R,G ou B)sans appliquer de masque,juste en utilisant une de ces méthodes GetRValue,GetGValue,GetBValue (Renvoi les composantes R ,G,B respectivement)ce qui donnerai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    r = (Byte)(((GetRValue(C1->Pixels[x-1][y-1] )) +
                    ...
                    ...
                    (GetRValue(C1->Pixels[x+1][y+1] )) / 9);
     
        C2->Pixels[x][y] = (TColor)(RGB(r,r,r));
    Puisque ici l'image est au niveau de gris les trois composantes on la même valeur.

  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 réalité, le compilateur n'applique pas de masque puisque celà revient précisément à récupérer le LSB du int (ce que BCB sait optimiser lors de la compilation) !
    C'est juste de l'écriture !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define GetRValue(rgb)   ((BYTE) (rgb))
    A plus !

  5. #5
    Membre éclairé Avatar de SmileSoft
    Inscrit en
    Mars 2008
    Messages
    436
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 436
    Par défaut Problème avec filtre moyenneur " flou uniforme" d'une image
    Salut

    Merci pour henderson et b_reda31,

    Avec la solution de henderson, l'image de resultat ne s'affiche pas voici le code que j'ai mis:
    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
     
    TCanvas *C1 = Image1->Picture->Bitmap->Canvas;
    TCanvas *C2 = Image2->Picture->Bitmap->Canvas;
    Byte r;
     
               for(int x=0;x<=Form1->Image1->Picture->Height-1;x++)
                 {
                   for( int y=0;y<=Form1->Image1->Picture->Width-1;y++)
                    {
    r = (Byte)(((C1->Pixels[x-1][y-1] & 0xFF) + (C1->Pixels[x-1][y] & 0xFF)+(C1->Pixels[x-1][y+1] & 0xFF)+(C1->Pixels[x][y-1] & 0xFF)+(C1->Pixels[x][y] & 0xFF)+(C1->Pixels[x][y+1] & 0xFF)+(C1->Pixels[x+1][y-1] & 0xFF)+(C1->Pixels[x+1][y] & 0xFF)+(C1->Pixels[x+1][y+1] & 0xFF)) / 9);
     
     C2->Pixels[x][y] = (TColor)(RGB(r,r,r))
                    }
                   }
     
    ;
    j'aimerai bien utiliser cette solution des pointeurs pour optimiser le temps de réponse , est ce que j'ai fait des erreurs dans là dessus??
    Avec la solution de b_reda31, le problème est réglé mais le temps de réponse est très long voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Byte r;
      for(int x=0;x<=Form1->Image1->Picture->Height-1;x++)
        {
        for( int y=0;y<=Form1->Image1->Picture->Width-1;y++)
        {
    r=(((GetRValue(Image1->Canvas->Pixels[x-1][y-1]) ) +(GetRValue(Image1->Canvas->Pixels[x-1][y]))+(GetRValue(Image1->Canvas->Pixels[x-1][y+1]))+(GetRValue(Image1->Canvas->Pixels[x][y]))+(GetRValue(Image1->Canvas->Pixels[x][y+1]))+(GetRValue(Image1->Canvas->Pixels[x+1][y-1]))+(GetRValue(Image1->Canvas->Pixels[x+1][y+1])) )/ 9);
            Image2->Canvas->Pixels[x][y] = RGB(r,r,r);
             }}
    Merci d'avance

  6. #6
    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

    Désolé, je n'ai pas fait attention !!!

    Remplacer :

    et donc pour éviter les avertissements du compilateur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (TColor)(RGB( (Byte)r, (Byte)r, (Byte)r))
    La propriété Pixels[X][Y] ne sert qu'à perdre du temps (en fait, non : ça sert à offrir aux utilisateurs préssés un code simple mais qui hélas fait perdre un temps précieux lors de l'exécution) !
    Donc l'optimisation du code nécessite de savoir sur quoi on travaille !
    Bitmap 8 bits ou 24 bits ?

    A plus !

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

Discussions similaires

  1. Problème avec filtre sur filtre
    Par barbapapa2 dans le forum IHM
    Réponses: 5
    Dernier message: 25/10/2008, 11h14
  2. Problème avec Filtre Blur sur un clip trop large
    Par gobi13 dans le forum ActionScript 1 & ActionScript 2
    Réponses: 0
    Dernier message: 20/01/2008, 23h51
  3. Problème avec filtre d'un formulaire ?
    Par HookerSeven dans le forum Access
    Réponses: 3
    Dernier message: 25/02/2006, 01h59

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