ウィーナー フィルターを使ったイメージのブレ除去
この例では、ウィーナー デコンボリューションを使用してイメージのブレを除去する方法を示します。ウィーナー デコンボリューションは、イメージと加法性ノイズの周波数特性が少なくともある程度わかっている場合に効果的に使用できます。
ブレを含むイメージのシミュレーション
ブレやノイズのない初期状態のイメージを読み取って表示します。
imOriginal = imread("cameraman.tif"); imshow(imOriginal) title("Original Image")

カメラの動きによって発生するブレを含むイメージをシミュレートします。まず、関数fspecialを使用し、11 度の角度で 21 ピクセルにわたる線形移動を指定することにより、点像分布関数 PSF を作成します。その後、imfilter を使用して、点像分布関数とイメージを畳み込みます。
元のイメージのデータ型は uint8 です。uint8 イメージを imfilter に渡すと、この関数は別の uint8 イメージを返すために、出力を量子化します。量子化誤差を低減するために、imfilter を呼び出す前にイメージを double に変換します。
PSF = fspecial("motion",21,11); imDouble = im2double(imOriginal); imBlurred = imfilter(imDouble,PSF,"conv","circular"); imshow(imBlurred) title("Blurred Image")

ノイズのない動きによるブレの復元
関数 deconvwnr を使用してブレを含むイメージを復元します。このブレを含むイメージにはノイズが含まれていないため、S/N 比 (NSR) 入力引数を省略できます。ノイズ推定を指定しない場合、ウィーナー復元フィルターは NSR が 0 に等しいと仮定します。
wnr1 = deconvwnr(imBlurred,PSF);
imshow(wnr1)
title("Restored Blurred Image")
ガウス ノイズを含む動きによるブレの復元
ガウス ノイズとブレを含むイメージをシミュレーションします。関数 imnoise を使用して、ブレを含むイメージにゼロ平均のガウス ノイズを追加します。
noise_mean = 0; noise_var = 0.0001; imBlurredNoisy = imnoise(imBlurred,"gaussian",noise_mean,noise_var); imshow(imBlurredNoisy) title("Blurred and Noisy Image")

ノイズ推定を指定せずに deconvwnr を使用して、ノイズとブレを含むイメージを復元してみます。ノイズ推定を指定しない場合、ウィーナー復元フィルターは理想的な逆フィルターと同等であり、入力イメージのノイズに非常に敏感な場合があります。
wnr2 = deconvwnr(imBlurredNoisy,PSF);
復元されたイメージを表示します。この復元におけるノイズは、イメージの内容が失われる程度まで増幅されます。
imshow(wnr2)
title("Restoration of Blurred Noisy Image (NSR = 0)")
より現実的な推定ノイズの値を指定した deconvwnr を使用して、ブレとノイズを含むイメージを復元してみます。
signal_var = var(imBlurredNoisy(:));
NSR = noise_var / signal_var;
wnr3 = deconvwnr(imBlurredNoisy,PSF,NSR);
imshow(wnr3)
title("Restoration of Blurred Noisy Image (Estimated NSR)")
8 ビット量子化ノイズを含む動きによるブレのシミュレーションと復元
視覚的には感知できない量のノイズでも結果に影響を与えることがあります。ノイズの原因の 1 つは、イメージを uint8 表現で操作することによる量子化誤差です。前に、この例で量子化誤差を避けるために、データ型 double で初期状態のイメージからブレを含むイメージをシミュレートしました。ここでは、復元に対する量子化誤差の影響を調査するために、元の uint8 データ型で初期状態のイメージからブレを含むイメージをシミュレートします。
imBlurredQuantized = imfilter(imOriginal,PSF,"conv","circular"); imshow(imBlurredQuantized) title("Blurred Quantized Image")

ノイズ推定を指定せずに deconvwnr を使用して、ブレを含み量子化されたイメージを復元してみます。ノイズは追加されていませんが、この復元では、データ型 double のブレを含むイメージの復元に比べイメージが劣化します。
wnr4 = deconvwnr(imBlurredQuantized,PSF);
imshow(wnr4)
title("Restoration of Blurred Quantized Image (NSR = 0)");
次に、推定した量子化ノイズについて、より現実的な値を指定します。uint8 データを扱う場合、量子化ステップ サイズは 1 です。
qss = 1; uniform_quantization_var = qss/12;
信号の分散を計算します。var 関数はデータ型 double のデータを必要とするため、分散を計算する前にピクセル値を double に変換します。ピクセル値を [0, 1] の範囲に再スケーリングしないでください。
signal_var = var(double(imBlurredQuantized(:)));
推定した量子化ノイズの NSR を使用して、deconvwnr により、ブレを含む量子化後のイメージを復元します。
NSR = uniform_quantization_var / signal_var;
wnr5 = deconvwnr(imBlurredQuantized,PSF,NSR);
imshow(wnr5)
title("Restoration of Blurred Quantized Image (Estimated NSR)");
参考
deconvwnr | fspecial | imfilter | imnoise