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++ Discussion :

programme du bruit gaussien


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2009
    Messages : 38
    Points : 38
    Points
    38
    Par défaut programme du bruit gaussien
    bonsoir , je travail avec c++ à propos du traitement d'image , j'ai fait tous les traitements , et je veut savoir comment ajouter un bruit gaussien à une image , bref je l'ait fait , voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if(choix){
     traitemt = true;
       int bruit=RandG(0.5,2)*10;  //bruit gaussien 
     
     for(int i=0;i<w;i++){
    for(int j=0;j<h;j++){
        ImgRes->Canvas->Pixels[i][j] = ImgRes1->Canvas->Pixels[i][j]+bruit;
    ImgRes1 c'est l'image en niveaux de gris


    j'ai donner des valeurs à l'amplitude ,la moyenne et l'ecart type , mais le probléme c'est que l'image ne sort pas bruiter ,ya que des taches vert sur elle ;quelqu'un peut m'aider s'il vous plait , merci

  2. #2
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    le problème est que ton nombre aléatoire n'est généré qu'une seule fois au début de ta fonction.

    Cela reviens à décaler les niveaux de gris de manière uniforme sur toute l'image.


    Tu devrais plutôt avoir quelque chose du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    int bruit; //bruit gaussien
     
    for(int i=0;i<w;i++){
        for(int j=0;j<h;j++){
            bruit=RandG(0.5,2)*10; // calcul d'un nouveau bruit
            ImgRes->Canvas->Pixels[i][j] = ImgRes1->Canvas->Pixels[i][j]+bruit;
        }
    }

  3. #3
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Le sujet a été déjà traiter, je te conseil de faire une recherche sur le forum.
    Sinon, jette un coups d'œil au forum dédié au traitement d'image (développez.net) , il y a une sujet récent et qui est résolu.

    Désolé, j'ai pas eu le temps de faire des recherches !

  4. #4
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if(choix){
     traitemt = true;
       int bruit=RandG(0.5,2)*10;  //bruit gaussien 
     
     for(int i=0;i<w;i++){
    for(int j=0;j<h;j++){
        ImgRes->Canvas->Pixels[i][j] = ImgRes1->Canvas->Pixels[i][j]+bruit;
    Regarde la documentation de ta librairie, pour savoir le type de Pixels... Si tu utilises Borland (ca y ressemble à mon avis), Pixels ce ne sont pas des int mais des TColor, dans lesquels les 3 composantes de couleur (RVB) sont codées chacune sur un octet...

    Pour changer la couleur, il faut changer les valeurs des trois composantes R, V et B, en décomposant la valeur du pixel (toujours sous Borland, ca va être atrocement lent, le mieux est de lire la doc de la fonction ScanLine, ca devrait mieux aller après...)

    Aussi, fais attention : les valeurs des couleurs sont contraintes à ne prendre que certaines valeurs. Si c'est de 0 à 255, il faut que tu "bornes" la modification à cet intervalle (sinon, tu vas voir de petites imperfections quand tu ajoutes du bruit à des zones très sombres ou très claires). Et, comme dit précédemment, il te faut varier le bruit d'un pixel à l'autre, sinon, ce n'est pas du bruit...

    Francois

  5. #5
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Avant de commencer à faire n'importe quoi dans quant on est novice, on commence par lire de la doc, faire un état de l'art etc ...

    Pour faire un traitement sur une image, il est beaucoup plus simple de convertir l'image en matrice, faire le traitement sur cette matrice et le sauver (dans certains cas) dans une nouvelle matrice, et pour finir convertir la matrice résultat en image.

    NB: convertir = transformer

    Pour ajouter un bruit à une image (sous entendu déjà converti en matrice), il faut voir de quel type est cette image, niveaux de gris ou couleurs.

    Si c'est en niveau de gris, pour ajouter le bruit, ben faire une addition et veiller à ce que les valeur ne dépassent pas 255, sinon les remplacer par 255.

    Dans le cas d'une image en couleur, il faut faire la même chose pour chaque bande de couleurs.

    Le code suivant est à bannir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     for(int i=0;i<w;i++){
        for(int j=0;j<h;j++){
                 ImgRes->Canvas->Pixels[i][j] = ImgRes1->Canvas->Pixels[i][j]+bruit;

  6. #6
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2009
    Messages : 38
    Points : 38
    Points
    38
    Par défaut
    merci pour vos réponses , je vais chercher cette commande Scan line ;si je ne comprend rien je poserai une autre question sur ca ;lol;
    @kmaniche:j'ai fait des recherche sur ca avant de poser la question ; et pour mon image je l'ait convertie en matrice pour que je puisse faire les traitement sur elle (NG , egalisation,etalement et les filtres) ;et l'image que j'essai de bruiter est celle en niveaux de gris.
    de tt façon je vais faire d'autres recherche sur cette cde et je vais voir ce que ca donnera

    Merci beaucoup

  7. #7
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2009
    Messages : 38
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par kmaniche Voir le message
    Avant de commencer à faire n'importe quoi dans quant on est novice, on commence par lire de la doc, faire un état de l'art etc ...

    Pour faire un traitement sur une image, il est beaucoup plus simple de convertir l'image en matrice, faire le traitement sur cette matrice et le sauver (dans certains cas) dans une nouvelle matrice, et pour finir convertir la matrice résultat en image.

    NB: convertir = transformer

    Pour ajouter un bruit à une image (sous entendu déjà converti en matrice), il faut voir de quel type est cette image, niveaux de gris ou couleurs.

    Si c'est en niveau de gris, pour ajouter le bruit, ben faire une addition et veiller à ce que les valeur ne dépassent pas 255, sinon les remplacer par 255.

    Dans le cas d'une image en couleur, il faut faire la même chose pour chaque bande de couleurs.

    Le code suivant est à bannir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     for(int i=0;i<w;i++){
        for(int j=0;j<h;j++){
                 ImgRes->Canvas->Pixels[i][j] = ImgRes1->Canvas->Pixels[i][j]+bruit;
    j'ai fait ce que fchaton a proposé, et ca a marché ; par contre j'ai aussi fait ce que vous avez proposé et ca donnée ca :

    int A=rand();

    if(choix){
    for(int i=0;i<w;i++){
    for(int j=0;j<h;j++){
    int bruit=RandG(1,2)*A;

    //ImgRes->Canvas->Pixels[i][j]
    ImgRes1->Canvas->Pixels[i][j]+bruit;
    if( ImgRes1->Canvas->Pixels[i][j]+bruit<255) {
    ImgRes->Canvas->Pixels[i][j]= ImgRes1->Canvas->Pixels[i][j]+bruit;
    }

    mais l'image est a peine bruiter , sinon je vais la laisser avec des valeurs comme ca et puis c tous , pour la commande ScanLine j'ai chercher sur la doc de c++ builder mais rien , sur le net j'ai trouver autre chose .
    l'importance MErci pour vos reponses

  8. #8
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    mais l'image est a peine bruiter , sinon je vais la laisser avec des valeurs comme ca et puis c tous , pour la commande ScanLine j'ai chercher sur la doc de c++ builder mais rien , sur le net j'ai trouver autre chose .
    l'importance MErci pour vos reponses
    Cela montre bien que c'est pas le bnon résultat. Pour te montrer que ton programme donne n'importe quoi, essaye de faire un ajout de bruit avec un autre logiciel d'imagerie, et vérifie au moins à l'oeil nu le résultat que tu as eu avec celui obtenu avec ton programme !!

    Pour scanline, sous builder tu fais :

    scanline +

  9. #9
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    En plus, sur le forum développez.net le sujet a été traité plusieurs fois :
    http://www.developpez.net/forums/d56...age-scaneline/

  10. #10
    Invité
    Invité(e)
    Par défaut
    ScanLine c'est une propriété de TBitmap (qui est un composant de TPicture, et puis de TImage... en gros, tu as un TBitmap planqué derrière chacun des composants image de Borland).

    Ca représente tous les pixels d'une image, trois par trois, dans l'ordre r,g,b, sous forme d'unsigned char, donc valeurs entre 0 et 255. Par exemple pour charger des couleurs à partir d'un tableau, tu feras quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for(int i=0;i<height;i++) {
      unsigned char *ptr;
      ptr=(unsigned char*)Image1->Picture->Bitmap->ScanLine[i];
      for(int j=0;j<width;j++) {
        ptr[3*j]=red[i][j];
        ptr[3*j+1]=green[i][j];
        ptr[3*j+2]=blue[i][j];
      }
    }
    (vérifie quand même pour l'ordre des couleurs, je cite de tête, là...)

    Francois

  11. #11
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Citation Envoyé par fcharton Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for(int i=0;i<height;i++) {
      unsigned char *ptr;
      ptr=(unsigned char*)Image1->Picture->Bitmap->ScanLine[i];
      for(int j=0;j<width;j++) {
        ptr[3*j]=red[i][j];
        ptr[3*j+1]=green[i][j];
        ptr[3*j+2]=blue[i][j];
      }
    }
    (vérifie quand même pour l'ordre des couleurs, je cite de tête, là...)

    Francois
    Pour une image en 24 Bits

  12. #12
    Membre actif Avatar de SmileSoft
    Inscrit en
    Mars 2008
    Messages
    436
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 436
    Points : 214
    Points
    214
    Par défaut
    salut aseau86

    ScaneLine parcoure l'image ligne par ligne donc la réponse est plus rapide paraport à pixels qui le fait pixel par pixel

    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
     
    Graphics::TBitmap *Source; // un pointeur sur un bitmap 
     
    Graphics::TBitmap *Res;
     
    class jRgb
    {
    public :
    Byte Blue;
    Byte Green;
    Byte Red;
    };
     
    jRgb *S;
    jRgb *R;
     
     
    Source=ImgSource->Picture->Bitmap; //Source est un pointeur sur le bitmap de l'image source
     
    Res=ImgRes->Picture->Bitmap; //Res est un pointeur sur le bitmap de l'image Résultat (ici c'est l'image bruitée)
    for(int y = 0; y < Source->Height; y++)  
        {
    /* on va faire le parcours de l'image source ligne par ligne  */
        S = (jRgb*)Source->ScanLine[y]; 
    /* S pointe sur la lige y du bitmap de l'image source */
        D = (jRgb*)Res->ScanLine[y];
    /* D pointe sur la ligne y du bitmap de l'image Bruitée */
        for(int x = 0; x < Source->Width; x++)
            {
    /* maintenant on va parcourir les colonnes x  pour chaque ligne (y) autrement on va parcourir les pixels de la ligne y qu'on a déjà fixé dans la boucle mère*/  
    //ici tu calcules le Bruit 
     
    /* pour une image en niveaux de gris tu as l'égalité entre les 3 composantes rouge, vert et bleu donc on peut utiliser par exemple la composante en bleu */
            D[x].Blue = (Byte)( (S[x].Blue )) + Bruit; 
     
            }
        }
     
    ImgRes->Repaint();
    bon courage,

  13. #13
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par kmaniche Voir le message
    Pour une image en 24 Bits
    Oui, c'est un peu le format "naturel" sous Borland, dans la mesure où les TCanvas ont des pixels codés sur 24 bits (via TColor). Quand on fait des modifications via un bitmap intermédiaire, c'est très souvent un 24 bits...

    Francois

  14. #14
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Citation Envoyé par SmileSoft Voir le message
    for(int y = 0; y < Source->Height; y++)
    {
    /* on va faire le parcours de l'image source ligne par ligne */
    S = (jRgb*)Source->ScanLine[y];
    /* S pointe sur la lige y du bitmap de l'image source */
    D = (jRgb*)Res->ScanLine[y];
    /* D pointe sur la ligne y du bitmap de l'image Bruitée */
    for(int x = 0; x < Source->Width; x++)
    {
    /* maintenant on va parcourir les colonnes x pour chaque ligne (y) autrement on va parcourir les pixels de la ligne y qu'on a déjà fixé dans la boucle mère*/
    //ici tu calcules le Bruit

    /* pour une image en niveaux de gris tu as l'égalité entre les 3 composantes rouge, vert et bleu donc on peut utiliser par exemple la composante en bleu */
    D[x].Blue = (Byte)( (S[x].Blue )) + Bruit;

    }
    }
    [/code]
    Et ne pas oublier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            D[x].Red    = D[x].Blue ; 
            D[x].Green = D[x].Blue ;
    Sinon, le cas le plus général :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            D[x].Red    = (Byte)( (S[x].Red )) + Bruit; 
             D[x].Green = (Byte)( (S[x].Green )) + Bruit; 
             D[x].Blue   = (Byte)( (S[x].Blue )) + Bruit;

  15. #15
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2009
    Messages : 38
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par kmaniche Voir le message
    Et ne pas oublier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            D[x].Red    = D[x].Blue ; 
            D[x].Green = D[x].Blue ;
    Sinon, le cas le plus général :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            D[x].Red    = (Byte)( (S[x].Red )) + Bruit; 
             D[x].Green = (Byte)( (S[x].Green )) + Bruit; 
             D[x].Blue   = (Byte)( (S[x].Blue )) + Bruit;


    Merciiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii beaucoup beaucoup , j'ai bien compris ;même très bien ;je vais l'appliquer , et je vous rendrai le résultat après

  16. #16
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2009
    Messages : 38
    Points : 38
    Points
    38
    Par défaut
    Merci infiniment pour votre aide , ca a bien marché

Discussions similaires

  1. Programme de Bruit Gaussien?
    Par Yukikurama dans le forum C
    Réponses: 4
    Dernier message: 13/11/2012, 16h51
  2. Niveau du bruit gaussien
    Par Casimirs dans le forum MATLAB
    Réponses: 0
    Dernier message: 18/10/2011, 20h28
  3. Comment ajouter un bruit gaussien
    Par kchiheb dans le forum MATLAB
    Réponses: 2
    Dernier message: 07/10/2008, 18h09
  4. Ajouter un bruit gaussien à une image
    Par SmileSoft dans le forum C++
    Réponses: 35
    Dernier message: 18/04/2008, 06h54
  5. Réponses: 0
    Dernier message: 08/04/2008, 20h19

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