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 :

Ajouter un bruit gaussien à une image


Sujet :

C++

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 Ajouter un bruit gaussien à une image
    Salut

    je travail avec c++ Builder 6, et cherche un code pour bruiter une image bmp par un bruit gaussien, est ce que vous pouvez m'aider

    Merci d'avance

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par SmileSoft Voir le message
    Salut

    je travail avec c++ Builder 6, et cherche un code pour bruiter une image bmp par un bruit gaussien, est ce que vous pouvez m'aider

    Merci d'avance
    L'image que tu lis finit dans un tableau dont le format est lié à celui de ton image (en noir et blanc, tu n'auras qu'une composante, en RGB, trois).

    Chaque composante varie de 0 à max (max = 255 dans la plupart des cas)

    Il te faut un générateur de nombres aléatoires qui te produise des nombres aléatoires selon une loi gaussienne (je ne sais pas ce que produit le générateur par défaut).

    Ensuite pour chaque pixel, il faut générer un bruit d'amplitude A (A = 20 par exemple). Tu auras dont un bruit B de allant de -20 à 20.

    A chaque composante de chaque pixel, tu ajoutes ce bruit (en écrétant à [0..255]) et tu sauvegardes la nouvelle image ainsi obtenue.

    Sinon il y a la solution d'utiliser la librairie CImg de l'Inria qui contient des fonctions déjà codées pour le traitement des images...

  3. #3
    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 ajouter un bruit gaussien à une image
    Salut kaji ,
    Citation Envoyé par Kaji Voir le message
    L'image que tu lis finit dans un tableau dont le format est lié à celui de ton image (en noir et blanc, tu n'auras qu'une composante, en RGB, trois).

    Chaque composante varie de 0 à max (max = 255 dans la plupart des cas)

    Il te faut un générateur de nombres aléatoires qui te produise des nombres aléatoires selon une loi gaussienne (je ne sais pas ce que produit le générateur par défaut).

    Ensuite pour chaque pixel, il faut générer un bruit d'amplitude A (A = 20 par exemple). Tu auras dont un bruit B de allant de -20 à 20.

    A chaque composante de chaque pixel, tu ajoutes ce bruit (en écrétant à [0..255]) et tu sauvegardes la nouvelle image ainsi obtenue.

    Sinon il y a la solution d'utiliser la librairie CImg de l'Inria qui contient des fonctions déjà codées pour le traitement des images...
    Merci pour ta réponse, tu ma donné une idée pour commencer, maintenant je trouve une difficulté pour la formule de la loi de gausse qui est f(x)=exp[-1/2((x-m)/écart type))²]/[écart type(sqrt(2pi)], j'aimerai bien que quelqu'un m'explique cette formule dans le cadre du géneration d'un bruit gaussien afin de bruiter une image.
    merci d'avace

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par SmileSoft Voir le message
    [...]maintenant je trouve une difficulté pour la formule de la loi de gausse qui est f(x)=exp[-1/2((x-m)/écart type))²]/[écart type(sqrt(2pi)], j'aimerai bien que quelqu'un m'explique cette formule dans le cadre du géneration d'un bruit gaussien afin de bruiter une image.
    merci d'avace
    Ta courbe f(x) est la fameuse "courbe en cloche" de Gauss, aussi appelée "Loi Normale". Tu peux la voir ici http://fr.wikipedia.org/wiki/Loi_normale

    Déjà il faut savoir ce que te donne le générateur de nombres aléatoires de C++...
    Je ne savais pas non plus et j'ai écrit un petit programme qui tire 100000 nombres de 0 à 100 et je compte le nombre dans le tableau tabNbSorties, le nombre de sorties. Par exemple, si le 50 et tiré une première fois, tabNbSorties[50] vaut 1. Si il sort une seconde fois, tabNbSorties[50] vaudra 2, etc.
    A la fin j'enregistre tous les compteurs du tableau tabNbSorties dans un fichier texte au format lisible par Scilab (il est gratuit). Il suffit de copier-coller le texte "y = [4 5 6 ... 7 5 4]; bar(y);" dans Scilab et tu obtiens un magnifique histogramme !

    Mon programme (C++ standard)
    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
     
    #include <stdlib.h>
    #include <iostream>
    #include <fstream>
     
    using namespace std;
     
    //
    // Renvoie un nombre aléatoire entre nMin et nMax
    //
    int getNbAleatoire(int nMin, int nMax) {
      return (int)(nMin + ((float) rand() / RAND_MAX * (nMax - nMin + 1)));
    }// getNbAleatoire
     
     
    int main(int argc, char *argv[]) {
      int nAmorce = 2;// amorce (vaut 1 par défaut)
      srand(nAmorce);
      const int ncMin = 0;
      const int ncMax = 99;
      const int ncTirages = 100000;
      // Raz du tableau de comptage
      int tabNbSorties[ ncMax + 1];
      for (int nI = ncMin; nI <= ncMax; ++nI ) {
        tabNbSorties[ nI ] = 0;
      }
      // Tirages et enregistrements
      for (int nI = 1; nI <= ncTirages; ++ nI) {
        int nbAleat = getNbAleatoire( ncMin, ncMax );
        tabNbSorties[ nbAleat ]++;
      }
      // Enregistrement de l'histogramme
      ofstream f_out;
      f_out.open("histo.txt", ios::out );
      f_out << "y = [";
      for (int nI = ncMin; nI <= ncMax; ++nI ) {
        f_out << tabNbSorties[ nI ] << " ";
      }
      f_out << "]; bar(y);";
      f_out.close();
      // fin
      system("PAUSE");
      return EXIT_SUCCESS;
    }// main
    En sortie, j'obtiens le tableau suivant par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    y = [1059 1037 976 937 1006 1023 990 983 1023 1034 1010 1008 982 1019 944 1011 1005 951 960 1050 1049 981 973 1024 1003 1008 976 917 1047 976 1014 1041 967 1011 943 928 1019 1050 1029 998 1009 975 960 1050 992 992 1044 1014 1000 1053 964 947 993 950 1055 1017 1000 1047 985 1018 1012 1028 1029 1018 973 1024 1012 1027 1009 1005 1026 991 968 966 960 987 938 935 963 1017 1058 1057 965 1007 1007 954 1021 1013 978 1039 1010 986 975 984 1000 999 996 1053 972 1009 ]; bar(y);
    Et là, on voit grâce à Scilab que l'histogramme est à peu-près plat.

    Et donc tu peux te servir du générateur de nombres aléatoires standard pour générer des valeurs de "x".

    Préalablement, tu calcules un histogramme (un tableau, donc) y = f(x) qui suive ta loi nomale Par exemple de x = 0 à x = 20 avec un maxi en x = 10 (y = f(10) = 20 par exemple) (La "cloche est centrée en x = 10 avec un mini en x = 0 et x = 20).
    Ensuite, pour chaque pixel, tu génères un nombre aléatoire x entre 0 et 20. Le bruit correspondant vaut B = y = f(x) et tu l'ajoutes aux composantes de ton pixel. Ecrétage éventuel à [0 .. 255], et le tour est joué.

    Eventuellement, tu calcules B = y - 10 pour avoir un bruit de -10 à 10...

  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 Ajouter un bruit gaussien à une image
    Salut kaji

    Résumant se que j'ai compris:
    • Je doit calculer un tableau histogramme selon la loi de gauss "cloche de gauss", donc j'aurai un tableau H allant du min jusqu'au max , je procède comme tu a fait dans ton code:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      Renvoie un nombre aléatoire entre nMin et nMax
      //
      int getNbAleatoire(int nMin, int nMax) {
        return (int)(nMin + ((float) rand() / RAND_MAX * (nMax - nMin + 1)));
      }// getNbAleatoire
      sauf pour la formule retournée j'utilise celle de gauss.

    • Pour chaque pixel Générer un nombre aléatoire x entre min et max par le générateur de builder; et trouver le bruit B correspondant dans le tableau H[x] tel que B=H[x]

    • En fin ajouter ce bruit B aux composantes de chaque pixel.


    Est ce que j'ai bien compris là?

    Merci d'avance

  6. #6
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Par défaut
    Bonjour,

    si tu regardes parmi les plugins d'ImageJ, tu en trouveras un qui fait ce que tu demandes. Le code est disponible
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par SmileSoft Voir le message
    Résumant se que j'ai compris:
    • Je doit calculer un tableau histogramme selon la loi de gauss "cloche de gauss", donc j'aurai un tableau H allant du min jusqu'au max
    Oui, c'est ça, tu remplis un tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float tabH[100];//par exemple
    Avec tabH[0], la première valeur de ta courbe en cloche, tabH[49], le maxi (20 par exemple) et tabH[99], la dernière valeur.

    Citation Envoyé par SmileSoft Voir le message
    Pour chaque pixel Générer un nombre aléatoire x entre min et max par le générateur de builder; et trouver le bruit B correspondant dans le tableau H[x] tel que B=H[x][/LIST]
    Pour chaque pixel, tu tires un nombre aléatoire x dans l'intervalle [0, 99] (la taille de ton histogramme) et le bruit gaussien aléatoire correspondant sera B = tabH[x].

    Citation Envoyé par SmileSoft Voir le message
    • En fin ajouter ce bruit B aux composantes de chaque pixel.
    Exactement. A chaque pixel, tu tires un "x" et tu calcules le bruit correspondant par B = tabH[x] que tu ajoutes à chaque composante du pixel (en écrêtant à la bonne plage souvent [0 .. 255])

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

Discussions similaires

  1. [Débutant] Ajouter une bruit gaussien à une video
    Par nadou nadouch dans le forum Images
    Réponses: 1
    Dernier message: 19/03/2013, 09h18
  2. Ajouter des fichiers dans une image de disque .tib
    Par koKoTis dans le forum Autres Logiciels
    Réponses: 22
    Dernier message: 30/08/2006, 22h20
  3. Effacer le bruit sur une image
    Par zehni dans le forum Images
    Réponses: 4
    Dernier message: 02/06/2006, 09h53
  4. [ImageMagick] Ajouter un texte dynamique à une image
    Par masseur dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 14/02/2006, 15h24
  5. Ajouter un tooltip sur une image
    Par K4sh dans le forum Balisage (X)HTML et validation W3C
    Réponses: 10
    Dernier message: 14/10/2005, 19h12

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