2016-04-09 1 views
2

J'ai une image sans bruit I. Je veux simuler le bruit gaussien additif (zéro moyen, et variation v) n ajouté à l'image. La sortie du model est:Lequel est la façon correcte de simuler le bruit gaussien additif

Z = I + n 

Pour simuler, nous avons deux façons:

  1. DEVENEZ bruit gaussien et l'ajouter à l'image,
  2. utilisation de la fonction imnoise dans Matlab.

J'ai utilisé les deux méthodes, mais elles ont donné des résultats différents. Pourriez-vous déterminer lequel est correct? Pourquoi ne sont-ils pas équivalents? À ma connaissance, je pense que imnoise est correcte.

Dans ma simulation, j'utilise une définition pour cent de bruit

Le nombre « pour cent du bruit » représente le rapport pour cent de l'écart-type du bruit gaussien par rapport au signal pour l'image entière.

I = imread('eight.tif'); 
[rows cols]=size(I); 
I = double(I); 
I = I - min(I(:)); 
I = I/max(I(:)); 
%% Percentage ratio 
noise_per=0.4; %40 percent noise 
%% Add noise to image 
v = (noise_per*std(I(:)))^2 %// Option #2 
%% Add noise by manual way 
n=normrnd(0,v,[rows cols]); 
I_noise1=I+n; 
%% Add noise by imnoise func. 
I_noise2 = imnoise(I, 'gaussian', 0, v); 

subplot(131);imshow(n,[]);title('Gaussian noise'); 
subplot(132);imshow(I_noise1,[]);title('Add Gaussian noise #1'); 
subplot(133);imshow(I_noise2,[]);title('Add Gaussian noise #2'); 

output

+0

J'ai testé votre code et a une erreur dans la ligne "I_noise1 = I + n;". Il dit que les dimensions de Matrix doivent être d'accord. Je n'ai pas l'original "eight.tif" donc j'ai dû utiliser une autre image – VMMF

+0

@VMMF: code ci-dessus suppose une image en niveaux de gris (mauvaise taille calculée si l'image était RGB) – Amro

Répondre

2

Outre le fait que normrnd prend écart-type en entrée tandis que imnoise attend variance (comme indiqué par @mainactual), il y a aussi la question du type de données et la gamme de valeurs.

Il y a une note dans imnoise documentation:

Remarque: La moyenne et les paramètres de la variance pour le type de bruit 'gaussienne' est toujours spécifiée comme si l'image était de la classe double dans l'intervalle [0, 1].Si l'image d'entrée est de classe uint8, la fonction imnoise convertit l'image en double, ajoute du bruit en fonction du type et des paramètres spécifiés, puis convertit l'image bruyante en la classe de l'entrée.

Dans votre cas où l'image d'entrée est déjà double dans [0,1] plage, cela signifie couper les valeurs de sortie à la gamme [0,1] après avoir ajouté le bruit. Dans ce cas, normrnd peut également être remplacé par un simple appel au randn

Exemple:

% input image 
I = imread('eight.tif'); 
I = im2double(I); % convert to double in [0,1] range 

% noise mean/variance 
m = 0; 
v = (0.4 * std(I(:)))^2; 

% normrnd 
noise1 = normrnd(m, sqrt(v), size(I)); 
I1 = I + noise1; 
I1 = max(0, min(I1, 1)); % clip to [0,1] range 

% randn 
noise2 = randn(size(I))*sqrt(v) + m; 
I2 = I + noise2; 
I2 = max(0, min(I2, 1)); % clip to [0,1] range 

% imnoise 
I3 = imnoise(I, 'gaussian', m, v); 

% compare 
subplot(221), imshow(I), title('original') 
subplot(222), imshow(I1), title('normrnd') 
subplot(223), imshow(I2), title('randn') 
subplot(224), imshow(I3), title('imnoise') 

image-gaussian-noise

+0

Merci Amro. J'ai lu du papier sur lequel ils donnent souvent le pourcentage de bruit et je le multiplie simplement avec la variance. Pensez-vous que ma mise en œuvre a un sens? – Jame

+0

Je pense donc, je suppose que cela dépend de la façon dont vous définissez "pourcentage de bruit" .. Voici quelques articles connexes: http://www.mathworks.com/matlabcentral/answers/51357-how-can-i-determine- le-pourcentage-de-bruit-donné-la-variance-de-imnoise, http://stackoverflow.com/questions/31834803/how-to-add-5-percent-gaussian-noise-to-image – Amro

1

Je l'essentiel en caractères gras:

J = imnoise(I,'gaussian',M,V) ajoute un bruit blanc gaussien de moyenne m et la variance v à l'image I. La valeur par défaut est zéro signifie bruit avec 0,01 variance. http://se.mathworks.com/help/images/ref/imnoise.html

et

R = normrnd(mu,sigma) génère des nombres aléatoires à partir de la distribution normale avec le paramètre mu moyen et l'écart type paramètre sigma. http://se.mathworks.com/help/stats/normrnd.html

Je pense que les deux voies devraient être assez égaux et également correct pour votre tâche et tout autre après la variance est corrigée, ce qui est, après

I_noise2 = imnoise(I, `gaussian`, 0, v^2); % orr sqrt(v) depends...