Main Content

ブラインド デコンボリューション アルゴリズムを使用したイメージのブレ除去

この例では、ブラインド デコンボリューションを使用してイメージのブレを除去する方法を示します。ブラインド デコンボリューション アルゴリズムは、歪み (ブレとノイズ) に関する情報が未知の場合でも効果的に機能します。アルゴリズムは、イメージと点像分布関数 (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");

Figure contains an axes object. The axes object with title Original Image contains 2 objects of type image, text.

手順 2: ブレのシミュレーション

カメラの移動や焦点が合わないためにブレる可能性がある現実のイメージをシミュレートします。この例では、実際のイメージをガウス フィルターで (imfilterを使用して) 畳み込むことによって、ブレをシミュレートします。ガウス フィルターは点像分布関数PSFで表されます。

PSF = fspecial("gaussian"710); Blurred = imfilter(I,PSF,"symmetric","conv"); imshow(Blurred) title("Blurred Image")

Figure contains an axes object. The axes object with title Blurred Image contains an object of type 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")

Figure contains an axes object. The axes object with title Deblurring with Undersized PSF contains an object of type image.

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")

Figure contains an axes object. The axes object with title Deblurring with Oversized PSF contains an object of type image.

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")

Figure contains an axes object. The axes object with title Deblurring with INITPSF contains an object of type image.

手順 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")

Figure contains 4 axes objects. Axes object 1 with title True PSF contains an object of type image. Axes object 2 with title Reconstructed Undersized PSF contains an object of type image. Axes object 3 with title Reconstructed Oversized PSF contains an object of type image. Axes object 4 with title Reconstructed true PSF contains an object of type image.

最初の復元で再生された PSF、P1は、明らかに制限サイズに収まりません。境界に強い信号変動があります。対応するイメージ、J1は、ブレたイメージBlurredと比べて鮮明さが改善されていません。

2 番目の復元で再生された PSFP2は、端がとても滑らかになっています。これは、復元ではよりサイズの小さい PSF を処理できることを意味します。対応するイメージJ2は、いくらかのブレ除去が見られますが、リンギングによって強く損なわれています。

最後に、3 番目の復元で再生された PSFP3は、P1P2の中間になっています。配列P3は真の PSF にとてもよく似ています。対応するイメージ、J3は、大幅に改善されていますが、リンギングによって損なわれています。

手順 5: 復元の改善

復元されたイメージ (J3) のリンギングは、コントラスト強度がはっきりしている部分とイメージの境界沿いに発生しています。この例では、重み関数を指定してリンギングの影響を低減する方法を示します。アルゴリズムにより配列WEIGHTに従って各ピクセルに重みが加えられ、イメージと PSF を復元します。この例では、最初に関数 edge を使用して "シャープな" ピクセルを見つけます。試行錯誤により、望ましいしきい値レベルは0.08であることがわかりました。

WEIGHT = edge(Blurred,"sobel"、。08);

範囲を広げるために、imdilateを使用して構造化要素seを渡します。

se =压力l("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")

Figure contains an axes object. The axes object with title Weight Array contains an object of type image.

deconvblindを呼び出してイメージを復元します。その際、配列WEIGHTを使用し、反復回数を30に増やします。ほぼすべてのリンギングが取り除かれました。

[J,P] = deconvblind(Blurred,INITPSF,30,[],WEIGHT); imshow(J) title("Deblurred Image")

Figure contains an axes object. The axes object with title Deblurred Image contains an object of type 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")

Figure contains an axes object. The axes object with title Deblurred Image contains an object of type image.

サイズの大きな初期 PSFOVERPSFを使用し、制約関数FUNを使用しなかった場合、結果のイメージは手順 3. で得られた不十分な結果J2と同様のものになっていたでしょう。

この例では、DAMPARREADOUTといったFUNの前の未指定パラメーターは省略することができ、プレース ホルダー ([]) は不要なことに注意してください。

参考

|

関連するトピック