このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
さまざまなイメージの歪みに対するブラインド デコンボリューションの適応
関数 deconvblind
を使用して、ブラインド デコンボリューション アルゴリズムによるイメージのブレ除去を行うことができます。アルゴリズムは、ポアソン ノイズ統計量を仮定して、ブレを含むイメージの代わりに、結果の PSF と畳み込んだ結果のイメージの尤度が最大になるようにします。ブラインド デコンボリューション アルゴリズムは、歪み (ブレとノイズ) に関する情報が未知の場合でも効果的に機能します。関数 deconvblind
は、高速化された減衰付きのルーシー・リチャードソン アルゴリズム同様に、反復過程を使用して、イメージと PSF を同時に復元します。
関数 deconvlucy
と同様に、関数 deconvblind
は、複雑なイメージ復元作業に使われる元のルーシー・リチャードソン最尤アルゴリズムでいくつかの改善を加えたものです。これらの改善機能では、次の作業を実行できます。
復元でのノイズの影響を低減
一様でないイメージの画質の考慮 (不良ピクセルなど)
カメラ出力ノイズへの対処
これらの改善機能の詳細については、さまざまなイメージの歪みに対するルーシー・リチャードソン逆畳み込みの適応を参照してください。関数 deconvblind
は、ユーザー定義の関数を通して指定できる PSF 制約もサポートしています。
ブラインド デコンボリューションを使用したイメージのブレ除去
この例では、ブラインド デコンボリューションを使用してイメージのブレを除去する方法を説明します。この例は、オプションのパラメーターを使用してイメージのブレ除去を 2 回試すことで、この操作の反復的な性質を示します。
イメージをワークスペースに読み取って表示します。
I = imread('cameraman.tif'); figure imshow(I) title('Original Image')
点像分布関数 (PSF) を作成します。PSF は、光学システムの光源のブレの度合いを表します。
PSF = fspecial('motion',13,45); figure imshow(PSF,[],'InitialMagnification','fit') title('Original PSF')
PSF を使用してイメージ内にシミュレートされたブレを作成し、ブレを含むイメージを表示します。
Blurred = imfilter(I,PSF,'circ','conv'); figure imshow(Blurred) title('Blurred Image')
関数 deconvblind
を使用してイメージのブレを除去します。PSF の初期推定を行わなければなりません。PSF のサイズを決定するために、ブレを含んでいるイメージを調べ、はっきりしたオブジェクトの周りのブレの幅をピクセル単位で測ります。PSF の サイズが中に含まれている値より重要であるため、初期の PSF として 1 からなる配列を通常は指定します。
この初期復元で、deconvblind
はイメージのブレを相当な程度まで除去できました。ただし、復元したイメージのコントラスト強度がはっきりしている部分の周囲にリンギングがあることに注意してください (この例では、シミュレートされたブレを含むイメージを作成する際に、imfilter
の 'circular' オプションを使用し、エッジ関連のリンギングを除去してあります)。より満足の得られる結果に到達するには、さまざまなサイズの PSF を試しながら操作を繰り返します。個々の逆畳み込みで出力される復元された PSF は、最適な PSF サイズで価値のあるヒントを与えます。
INITPSF = ones(size(PSF));
[J P] = deconvblind(Blurred,INITPSF,30);
figure
imshow(J)
title('Restored Image')
figure imshow(P,[],'InitialMagnification','fit') title('Restored PSF')
良い結果を得る方法の 1 つは、重み配列を作成してブレ除去操作からコントラストの高い部分を除外することです。これは、結果の中にコントラストに関連したリンギングを低下させることができます。
重み配列を作成するには、イメージと同じサイズの配列を作成し、元のイメージ内の処理から除外するピクセルに対応する配列内のピクセルの値を 0 に指定します。この例ではエッジ検出とモルフォロジー処理を組み合わせて使用し、イメージ内のコントラストの高い領域を検出します。この例ではイメージ内のブレが線形なので、2 回膨張処理を行っています この例では、イメージの境界のピクセル (コントラストの高い部分) を処理から除外するために、padarray
を使用してすべての境界ピクセルに値 0 を割り当てます。
WEIGHT = edge(I,'sobel',.28); se1 = strel('disk',1); se2 = strel('line',13,45); WEIGHT = ~imdilate(WEIGHT,[se1 se2]); WEIGHT = padarray(WEIGHT(2:end-1,2:end-1),[1 1]); figure imshow(WEIGHT) title('Weight Array')
PSF の推定値を改善します。1 回目の逆畳み込みで返された、再構成された PSF P
は、明らかな線形性を示しています。この例では、2 回目の実行に新しい PSF を使用します。振幅の小さいピクセルを 0 に設定する以外は、返された PSF と同じものです。
P1 = P; P1(find(P1 < 0.01))= 0;
今度は重み配列と変更した PSF を指定して、逆畳み込みを再実行します。強度がはっきりしている部分の周囲で、復元されたイメージのリンギングが 1 回目の結果と比べてどのくらい小さくなっているかを確認してください。
[J2 P2] = deconvblind(Blurred,P1,50,[],double(WEIGHT));
figure, imshow(J2)
title('Newly Deblurred Image');
figure, imshow(P2,[],'InitialMagnification','fit') title('Newly Reconstructed PSF')
結果の画質向上
既定の設定では、関数 deconvblind
は、ブレ除去プロセスで複数の反復を行います。反復の途中の任意の回で処理を停止して結果をチェックし、その後、停止した位置から反復を再開できます。この機能を使用するには、ブレを含むイメージ (たとえば、{Blurred}
) と cell 配列としての PSF (たとえば、{INITPSF}
) の両方を渡します。
関数 deconvblind
は、出力イメージと復元した PSF を cell 配列として出力します。出力イメージの cell 配列には次の 4 つの要素が含まれています。
要素 | 説明 |
---|---|
| 元の入力イメージ |
| 最後の反復によって生成されたイメージ |
| 最後から 2 番目の反復によって生成されたイメージ |
| プロセスの再開位置を知るために |
PSF 出力 cell 配列は、同様の要素を含んでいます。