2016-04-09 42 views
2

我有一個無噪聲圖像I。我想模擬添加到圖像中的加性高斯噪聲(零均值,並且變化vn。該model的輸出是:哪一個是模擬附加高斯噪聲的正確方法

Z = I + n 

模擬它,我們有兩種方式:

  1. 創建一個高斯噪聲,並將其添加到圖像,
  2. 使用imnoise功能的MATLAB。

我使用了兩種方式,但他們給出了不同的結果。你能確定哪一個是正確的?他們爲什麼不等同?據我所知,我認爲imnoise是正確的。

在我的模擬中,我使用的噪聲%的定義

「百分比噪聲」號表示高斯噪聲對用於整個圖像的信號的標準偏差的百分比率。

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

我測試代碼,並得到了在線路錯誤 「I_noise1 = I + N;」。它說Matrix的尺寸必須一致。我沒有原始的「eight.tif」,所以我不得不使用另一個圖像 – VMMF

+0

@VMMF:上面的代碼假設灰度圖像(如果圖像是RGB,則計算錯誤的尺寸) – Amro

回答

2
的事實, normrnd需要

除了標準差作爲輸入,而imnoise預計差異(正如@mainactual所指出的),也存在數據類型和值範圍的問題。

有一個在imnoise文檔的註釋:

:關於「高斯」噪聲類型的均值和方差的參數總是被指定爲如果圖像中的範圍爲[0是double類, 1]。如果輸入圖像屬於uint8類,則imnoise函數將圖像轉換爲double,根據指定的類型和參數添加噪聲,然後將噪聲圖像轉換回與輸入相同的類。

在你的情況,其中輸入圖像是已經在double [0,1]範圍內,這意味着將所述噪聲後削波的輸出值,以[0,1]範圍內。

另外normrnd在這種情況下可以用簡單的電話randn來代替。

實施例:

% 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

謝謝Amro。我讀過一些他們經常給出噪音百分比的論文,我只是將它與差異相乘。你認爲我的實施有意義嗎? – Jame

+0

我想是這樣,我想這取決於你如何定義「噪聲百分比」。下面是一些相關的帖子:http://www.mathworks.com/matlabcentral/answers/51357-how-can-i-determine-噪音的百分比給定的方差的imnoise,http://stackoverflow.com/questions/31834803/how-to-add-5-percent-gaussian-noise-to-image – Amro

1

予加粗本質:

J = imnoise(I,'gaussian',M,V)增加的平均值m高斯白噪聲和方差 v到圖像I.默認值是零平均噪聲與0.01方差。 http://se.mathworks.com/help/images/ref/imnoise.html

R = normrnd(mu,sigma)從與平均參數mu和標準偏差參數西格瑪正態分佈產生隨機數。 http://se.mathworks.com/help/stats/normrnd.html

我覺得方差修正後的兩種方式應該是相當平等的,你的任務同樣正確和任何其他,那就是後

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