1. ホーム
  2. matlab

[解決済み] imnoiseを使って画像にガウシアンノイズを加える

2022-02-07 01:10:42

質問

SNR=5dBの白色ガウスノイズを画像に加えるには、次のようにします。 imnoise ?

構文があることは知っています。

J = imnoise(I,type,parameters)

とします。

SNR = 10log10[var(image)/var(error image)]

このSNR値を使って、画像にノイズを加えるにはどうすればよいのでしょうか?

どのように解決するのですか?

まず、SNRとノイズの関係から見ていきましょう。誤差画像は元画像とノイズ画像の差分であり、誤差画像はノイズそのものということになります。したがって、SNRは実際には

<ブロッククオート

SNR = 10log10[var(image)/var(noise)]

ある画像でSNR=5dbの場合、ノイズの分散は次のようになる。

var(noise) = var(image)/10SNR/10 = var(image)/sqrt(10)

では、これらをすべてMATLABのコードに置き換えてみましょう。ある画像に白色ガウスノイズを加えるには(これを I を使用しています。 imnoise コマンドを使用すると、構文は次のようになります。

I_noisy = imnoise(I, 'gaussian', m, v)

ここで m は平均ノイズであり v はその分散である。また、重要なのは imnoise は、画像中の強度が I は0から1までの範囲である。

この例では、ゼロ平均のノイズを加え、その分散は v = var(I(:))/sqrt(10) . 完全なコードは

%// Adjust intensities in image I to range from 0 to 1
I = I - min(I(:));
I = I / max(I(:));

%// Add noise to image
v = var(I(:)) / sqrt(10);
I_noisy = imnoise(I, 'gaussian', 0, v);

明確な説明:私たちは var(I(:)) に含まれるすべてのサンプルの分散を計算するように処理します. I (代わりに var(I) これは列に沿って分散を計算します)。

お役に立てれば幸いです。

使用例

I = imread('eight.tif');
I = double(I);

%// Adjust intensities in image I to range from 0 to 1
I = I - min(I(:));
I = I / max(I(:));

%// Add noise to image
v = var(I(:)) / sqrt(10);
I_noisy = imnoise(I, 'gaussian', 0, v);

%// Show images
figure
subplot(1, 2, 1), imshow(I), title('Original image')
subplot(1, 2, 2), imshow(I_noisy), title('Noisy image, SNR=5db')

その結果がこちらです。