このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
ブラインド デコンボリューション アルゴリズムを使用したイメージのブレ除去
この例では、ブラインド デコンボリューションを使用してイメージのブレを除去する方法を示します。ブラインド デコンボリューション アルゴリズムは、歪み (ブレとノイズ) に関する情報が未知の場合でも効果的に機能します。アルゴリズムは、イメージと点像分布関数 (PSF) を同時に復元します。減衰を考慮した高速のルーシー・リチャードソン アルゴリズムが各反復において使用されます。さらに光学システム (カメラなど) の特性を入力パラメーターとして使用すると、イメージの復元の品質向上に役立ちます。PSF の制約は、ユーザー指定の関数で指定できます。
手順 1: イメージの読み取り
グレースケール イメージをワークスペースに読み取ります。関数 deconvblind
は任意の次元の配列を処理できます。
I = imread("cameraman.tif"); figure;imshow(I);title("Original Image"); text(size(I,2),size(I,1)+15, ... "Image courtesy of Massachusetts Institute of Technology", ... "FontSize",7,"HorizontalAlignment","right");
手順 2: ブレのシミュレーション
カメラの移動や焦点が合わないためにブレる可能性がある現実のイメージをシミュレートします。この例では、実際のイメージをガウス フィルターで (imfilter
を使用して) 畳み込むことによって、ブレをシミュレートします。ガウス フィルターは点像分布関数 PSF
で表されます。
PSF = fspecial("gaussian",7,10); Blurred = imfilter(I,PSF,"symmetric","conv"); imshow(Blurred) title("Blurred Image")
手順 3: ブレたイメージを異なるサイズの PSF を使用して復元
真の PSF のサイズを認識することが重要であることを説明するために、この例では 3 つの復元を行います。毎回 PSF の再生は一様な配列 (1 の配列) から開始します。
J1
および P1
によって記述される最初の復元は、小さな配列 UNDERPSF
を使用して初期の PSF を推定します。配列 UNDERPSF のサイズは、各次元で真の PSF よりも 4 ピクセル短くなります。
UNDERPSF = ones(size(PSF)-4);
[J1,P1] = deconvblind(Blurred,UNDERPSF);
imshow(J1)
title("Deblurring with Undersized PSF")
J2
および P2
によって記述される 2 番目の復元は、1 の配列 OVERPSF
を使用して、各次元で真の PSF よりも 4 ピクセル長い初期の PSF を推定します。
OVERPSF = padarray(UNDERPSF,[4 4],"replicate","both"); [J2,P2] = deconvblind(Blurred,OVERPSF); imshow(J2) title("Deblurring with Oversized PSF")
J3
および P3
によって記述される 3 番目の復元は、1 の配列 INITPSF
を使用して、真の PSF とサイズがまったく等しい初期の PSF を推定します。
INITPSF = padarray(UNDERPSF,[2 2],"replicate","both"); [J3,P3] = deconvblind(Blurred,INITPSF); imshow(J3) title("Deblurring with INITPSF")
手順 4: 復元された PSF の解析
3 つの復元すべてで PSF の生成も行われます。次の図は、再生された PSF が初期 PSF の正しいサイズの推定にどのように役立つかを示します。真の PSF であるガウス フィルターでは、値は中央 (白) で最大になり境界 (黒) では小さくなります。
figure; subplot(2,2,1) imshow(PSF,[],"InitialMagnification","fit") title("True PSF") subplot(222) imshow(P1,[],"InitialMagnification","fit") title("Reconstructed Undersized PSF") subplot(2,2,3) imshow(P2,[],"InitialMagnification","fit") title("Reconstructed Oversized PSF") subplot(2,2,4) imshow(P3,[],"InitialMagnification","fit") title("Reconstructed true PSF")
最初の復元で再生された PSF、P1
は、明らかに制限サイズに収まりません。境界に強い信号変動があります。対応するイメージ、J1
は、ブレたイメージ Blurred
と比べて鮮明さが改善されていません。
2 番目の復元で再生された PSF P2
は、端がとても滑らかになっています。これは、復元ではよりサイズの小さい PSF を処理できることを意味します。対応するイメージ J2
は、いくらかのブレ除去が見られますが、リンギングによって強く損なわれています。
最後に、3 番目の復元で再生された PSF P3
は、P1
と P2
の中間になっています。配列 P3
は真の PSF にとてもよく似ています。対応するイメージ、J3
は、大幅に改善されていますが、リンギングによって損なわれています。
手順 5: 復元の改善
復元されたイメージ (J3
) のリンギングは、コントラスト強度がはっきりしている部分とイメージの境界沿いに発生しています。この例では、重み関数を指定してリンギングの影響を低減する方法を示します。アルゴリズムにより配列 WEIGHT
に従って各ピクセルに重みが加えられ、イメージと PSF を復元します。この例では、最初に関数 edge を使用して "シャープな" ピクセルを見つけます。試行錯誤により、望ましいしきい値レベルは 0.08
であることがわかりました。
WEIGHT = edge(Blurred,"sobel",.08);
範囲を広げるために、imdilate
を使用して構造化要素 se
を渡します。
se = strel("disk",2);
WEIGHT = 1-double(imdilate(WEIGHT,se));
また、境界に近いピクセルには値 0
を割り当てます。
WEIGHT([1:3 end-(0:2)],:) = 0;
WEIGHT(:,[1:3 end-(0:2)]) = 0;
figure
imshow(WEIGHT)
title("Weight Array")
deconvblind
を呼び出してイメージを復元します。その際、配列 WEIGHT
を使用し、反復回数を 30
に増やします。ほぼすべてのリンギングが取り除かれました。
[J,P] = deconvblind(Blurred,INITPSF,30,[],WEIGHT);
imshow(J)
title("Deblurred Image")
手順 6: PSF 復元に追加の制約を使用
例では、PSF に追加の制約を指定する方法を示します。次の関数 FUN
は、修正された PSF 配列を返します。deconvblind
はこの配列を次の反復に使用します。
この例では、FUN
は、各次元で P1
および P2
個のピクセルを切り取り、配列をゼロ パディングによって元のサイズに戻すことにより PSF を修正します。この操作は PSF の中央の値を変更しませんが、PSF サイズを 2*P1
ピクセルと 2*P2
ピクセル分効果的に縮小します。
P1 = 2; P2 = 2; FUN = @(PSF) padarray(PSF(P1+1:end-P1,P2+1:end-P2),[P1 P2]);
無名関数 FUN
は最後に deconvblind
に渡されます。関数 FUN
に追加のパラメーターを指定する方法の詳細については、『MATLAB 数学』ドキュメンテーションの関数のパラメーター化の節を参照してください。
この例では、初期 PSFのサイズ OVERPSF
は、真の PSF よりも 4 ピクセル大きくなっています。FUN
でパラメーターを P1 = 2
および P2 = 2
に設定すると、OVERPSF
の有効なスペースが実質的に真の PSF と同じサイズになります。そのため、結果 JF
および PF
は、手順 4 で適切なサイズの PSF を使用して FUN
を呼び出さない逆畳み込みの結果 J
および P
と似ています。
[JF,PF] = deconvblind(Blurred,OVERPSF,30,[],WEIGHT,FUN);
imshow(JF)
title("Deblurred Image")
サイズの大きな初期 PSF OVERPSF
を使用し、制約関数 FUN
を使用しなかった場合、結果のイメージは手順 3. で得られた不十分な結果 J2
と同様のものになっていたでしょう。
この例では、DAMPAR
や READOUT
といった FUN
の前の未指定パラメーターは省略することができ、プレース ホルダー ([]
) は不要なことに注意してください。