2011-08-02 19 views
1

Matlabの中で私は既知の分散を持つ画像にノイズを追加しています。Matlabで画像のノイズの分散を推定する

var = 0.01; 
i = im2double(imread('lena.bmp')); 
i_n = imnoise(i, 'gaussian',0,var); 

結果的にノイズが発生することは明らかです。しかし、私は、私は本当にすべての相関

k = [1 4 6 4 1]'*[1 4 6 4 1]; 
kk = k ./sum(sum(k)); 

var_est = median(median(abs(i_n - imfilter(i_n,kk)))) 

    var_est(:,:,1) = 

    0.0631 


    var_est(:,:,2) = 

    0.0620 


    var_est(:,:,3) = 

    0.0625 

を見ていないよ、ハイパスフィルタの中央値を算出することにより、ノイズ分散を推定しようとする場合、私は分散を推定感謝難しい問題ですが、私はちょうど取得したいです合理的に近い結果、例えば50%の誤差は許容される。私は間違って何をしていますか?

+1

この式が実際に必要なものかどうかはわかりません。あなたがそれを見つけた場所を提供することはできますか?それは紙の中でしたか? – Phonon

+0

@Phonon - 私は今、参照を探しています、私はかなり紙の中でそれを読んで確信しています。直感的には、ハイパスフィルタをかけた後にノイズとエッジのディテールが残っているので、ノイズが量的に支配的になるので、中央値はノイズ分散の妥当な推定値にする必要があります。 – trican

+0

ahaさらに1/0.675のスケーリングファクタが必要です。それから非常に合理的なエスケイテートが0.00926 – trican

答えて

2

この場合は、実際には、すべての周波数で成分を示す白色ノイズの近似バージョンを追加しているので、このケースでは不十分です。ハイパスフィルタを使用すると、ノイズの周波数成分がクリッピングされるため、推定精度が低下します。

確かに言及したように、1つの画像からのノイズ推定は簡単な問題ではありません。しかし、いくつかのアプローチがあります。たとえば、データの分散(この場合、カーネルの下のピクセル強度)を取得して近似できるmedian absolute deviationを使用できます。

+0

あなたの答えに感謝します。しかし、私はまだ私が得た答えについてはよく分かりません。私はあなたを正しく理解していると仮定して、私は以下のことを行いました:i_median(:、:、1)= medfilt2(i_n(:、:、1)); i_median(:、:、2)= medfilt2(i_n(:、:、2)); i_median(:、:、3)= medfilt2(i_n(:、:、3)); var_est =中央値(中央値(中央値(abs(i_n-i_median))))。これは0.0590の答えを与えます - これは正しいとは思われませんか? – trican

1

ハイパスフィルタリングの分散を計算できます画像。 Variableを計算するMatlab関数の名前なので、変数名にvarを使用しないでください。

v = var; % use v instead of var for your variance variable 
clear var; % clear your variable "var" so we can use the var function 
est_variance = var(reshape(i_n - imfilter(i_n,kk), [], 1)); 
+0

応答kristiのおかげで - 私は明らかに何か間違っている私は上記の私はest_variance = 199.0065を取得しようとするとしようとしている!?唯一の変更は、私はuint8で画像を開き、分散コマンドの前にdouble変換を行うことです。つまり、est_variance = var(double(reshape(i_n - imfilter(i_n、kk)、[]、1)))) 。それは上記のようにim2doubleを使って再試行したと私は0.0085を取得したと述べた。これはまさに正しいことです。特に、上記の@msotaquiraの点を考慮してください。 – trican

関連する問題