2016-04-09 58 views
2

ノイズフリーの画像Iがあります。私は付加的なガウス雑音(ゼロ平均、および変動vnを画像に追加したいと思います。 modelの出力は次のとおりです。付加ガウス雑音をシミュレートする正しい方法はどれですか?

  1. MATLABでimnoise機能を使用するガウス雑音を作成して、画像に追加し、
  2. Z = I + n 
    

    それをシミュレートするために、我々は2つの方法があります。

私は両方の方法を使用しましたが、それぞれ異なる結果が得られました。どちらが正しいのか判断できますか?なぜ彼らは同等ではないのですか?私の知識では、私は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;"。マトリクスの次元は一致しなければならないとしている。私は元の "eight.tif"を持っていないので、別のイメージを使用しなければならなかった。 – VMMF

+0

@VMMF:上記のコードはグレースケールイメージと仮定する(画像がRGBなら間違ったサイズが計算される) – Amro

答えて

2

後、つまり、分散が修正された後、両方の方法はかなり等しく、あなたのタスクにも同様に正しいと他のすべきだと思います標準偏差を入力とし、imnoise分散(@mainactualと記されている)を期待していますが、データ型と値の範囲の問題もあります。

imnoiseドキュメントの注釈が存在し

「ガウス」ノイズの種類についての平均および分散パラメータは常に画像が範囲[0、クラスdoubleのものであったかのように指定されているが、 1]。入力画像がクラスuint8の場合、imnoise関数は画像をdoubleに変換し、指定されたタイプとパラメータに従ってノイズを追加し、ノイズのある画像を入力と同じクラスに変換し直します。入力画像がすでに[0,1]の範囲内doubleあるあなたのケースで

、これがノイズを付加した後、[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-雑音の分散率を与えた雑音の割合、http://stackoverflow.com/questions/31834803/how-to-add-5-percent-gaussian-noise-to-image – Amro

1

Iは不可欠を太字:

J = imnoise(I,'gaussian',M,V)デフォルトがゼロである画像Iに対する平均m及び分散 Vのガウス白色ノイズを付加してノイズを平均0.01分散。 http://se.mathworks.com/help/images/ref/imnoise.html

R = normrnd(mu,sigma)平均パラメータMUと標準偏差パラメータシグマ正規分布から乱数を生成します。 http://se.mathworks.com/help/stats/normrnd.html

私はnormrndがかかるという事実は別に

I_noise2 = imnoise(I, `gaussian`, 0, v^2); % orr sqrt(v) depends... 
関連する問題