Tu sais, Matthieu, que Claude Allègre a une très bonne formation et qu'il émet des doutes sur le réchauffement climatique ?
Blague à part, la référence pour moi en calcul numérique, c'est Numerical Recipes www.nr.com
Et justement, ils ont traité le problème des nombres aléatoires selon une Gaussienne.
J'ai même trouvé sur le site de Pierre Chatelier une implémentation de l'algo de Numerical Recipes.
http://ktd.club.fr/programmation/cpp-random.php. Il y a même ses tests avec.
Je pense que tu (SmileSoft) devrait le tester et l'utiliser... (avec son autorisation)
Sinon il y a une implémentation toute faite de l'algo de Box-Muller.
En performance, le classement des algos devrait donner ceci :
1) Numerical Recipes (de loin !!)
2) Le mien![]()
3) Box-Muller
Bon bruitage...![]()
Dernière modification par E.Bzz ; 28/09/2010 à 11h14. Motif: LE
Faut juste une licence pour utiliser le code des NR (et quand je vois le code fourni, c'est parfois...)...
Maintenant, si tu veux vraiment classer le code, la vitesse ne veut rien dire dans ce cas, ce qui est primordial, c'est la qualité de la génération aléatoire, et là ton code est bien loin derrière Box-Muller ou la solution des NR.
Salut Kaji et Matthieu
je vous remercie pour cette riche discussion
je travaille maintenant sur une autre méthode, j'ai trouvé ce que donne le générateur des nombre aléatoires de c++ builder, et j'ai pensé à une petite solution qui parait simple.
Supposant que j'ai une image que je vais lui ajouter un bruit B avec le sigma=0.2 alors:Remarque: j'ai utilisé la formule de gauss à 2 dimension (pour image)
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 int i,x,y=0; float B; randomize(); for( i=0;i<Form1->Image1->Picture->Width;i++)// parcours des ligne de l'image. { for(int j=0;j<Form1->Image1->Picture->Height;j++) // parcours des colonnes de l'image. { x=rand()%20; y=rand()%20; B=exp(-(x*x+y*y)/(2*0.2*0.2)); //l'ajout du bruit Form1->Image1->Canvas->Pixels[i][j]=Form1->Image1->Canvas->Pixels[i][j]+B; } } }
f(x,y)=exp( - (x*x+y*y) / (2*sigma*sigma))
- Est ce que je suis dans le bon sens?
- Je trouve une difficulté pour le sigma:
Est ce qu'il doit être calculé ?
ou c'est un paramètre que l'user va entrer?
Merci d'avance![]()
Euh... B n'est pas un bruit gaussien...
C'est un bruit, mais pas gaussien (fais le calcul par toi-même, il n'est même pas de moyenne nulle)
Box muller c'est quant meme pas compliqué !!!
salut
j'ai essayé un autre code, là j'utilise une image couleur (rgb):
sachant que la fonction RandG est le générateur des nombres aléatoires gaussien de c++ builder.
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 void __fastcall TForm1::Button2Click(TObject *Sender) { int B; int amplitude=50; randomize(); int r,v,b=0; for(int i=0;i<Form1->Image1->Picture->Width;i++) { for(int j=0;j<Form1->Image1->Picture->Height;j++) { B=(char )( RandG( 0.0,0.3 ) * amplitude ); // RandG génère des nombre aléatoir selon la loi de gauss. // l'ajout du bruit B à chaque composantes R, G et B de l'image r=GetRValue(Image1->Canvas->Pixels[i][j])+B; v=GetGValue(Image1->Canvas->Pixels[i][j])+B; b=GetBValue(Image1->Canvas->Pixels[i][j])+B; Form1->Image1->Canvas->Pixels[i][j]=RGB(r,v,b); } } }
Est ce que B est un bruit gaussien ?
Merci d'avance![]()
Dans ce cas, oui. En revanche, je ne connais pas la qualité du générateur sous-jacent, ça peut marcher dans ce cas et si tu le réutilises avec des outils plus complexes planter dans un problème statistique.
Salut SmileSoft,
Désolé pour le retard... félicitations pour ton code... Je ne connaissais pas la fonction RandG de Builder...
D'après la doc BCB, oui...
Pour en être sûr, il faudrait effectuer un petit test et tracer l'histogramme de répartition...
Par contre, j'ai l'impression que tu as oublié dans ton code d'écrêter les valeurs des composantes de tes pixels.
Je ne sais pas quel est la plage de valeurs, mais si c'est du [0..255], et que tu as des pixels blancs [255, 255, 255] auxquels tu ajoutes du bruit, ces pixels vont peut-être se retrouver noirs !!![]()
Bonjour à vous,
Je pense que ce que Kaji veut dire c'est qu'on ajoutant la valeur B (le nombre aléatoire généré)à chaque composante (R,V,B),Il serait possible que les nouvelles valeurs des composantes (R,V,B)dépassent 255!!
Ce qui donnerai des résultats pas trés attendus!![]()
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager