逆フィルターを使用して空間的にたたみ込まれた画像を補正する(デコンボリューション)


8

宿題の一環として、逆フィルターを実装しています。画像を劣化させ、逆フィルターで回復します。

5x5ボックスフィルターを使用して空間領域で画像をたたみ込みます。IフィルターをFFT、劣化画像をFFTし、劣化画像をフィルターで除算します。結果を画像に逆FFTすると、ゴミが発生します。

画像をFFTする場合、フィルターをFFTし、2つを乗算し、その結果をFFTフィルターで除算すると、元の画像に非常に近くなります。((X * Y)/ Y〜== X)

数学は「空間畳み込み== FFT乗算」ほど単純ではありません。

逆フィルターを使用する正しい方法は何ですか?使用されている正確なカーネルでイメージを劣化させています。ノイズを加えていません。

Bovikの教科書「画像処理の基本ガイド」では、ほぼ完全に逆フィルターを無視しています。Gonzalez&Woodsはもう少し希望がありますが、ほとんどすぐにウィーナーフィルターにスキップします。

私はstackoverflow.comで同様の質問をしてい ます/programming/7930803/inverse-filter-of-spatially-convolved-versus-frequency-convolved-image

(この質問にも[宿題]のタグを付ける必要がありますが、タグはまだ存在せず、作成する担当者もいません。)

編集。以下のいくつかの素晴らしい提案について。@ dipan-mehta FFTを行う前に、畳み込みカーネルを画像と同じサイズにパディングしています。カーネルを左上に配置しています。次にifft(ifftshift())を画像に保存すると、良い結果が得られます。カーネルとイメージの両方でifft(ifftshift())を実行しました。良い(ish)結果。(画像は私の/programming/7930803/inverse-filter-of-spatially-convolved-versus-frequency-convolved-image質問にあります。)

@ jason-rはおそらく正しいでしょう。基礎となる畳み込み+変換の数学を理解していません。「デコンボリューション」は私にとって新しい言葉でした。まだ学ぶべきことがたくさんあります。助けてくれてありがとう!

宿題の私の解決策は、周波数領域ですべてを行うことです。教授と話をした。私は必要以上に割り当てを難しくしていました。彼女は、ノイズを追加してから、逆フィルター、ウィーナーフィルター、および制約付き最小二乗フィルターを試してみたかったのです。演習のポイントは、フィルターがノイズをどのように処理するかを確認することでした。


1
FFTを行う前に、フィルターをゼロでパディングして画像と同じサイズにしますか?複雑な分割を正しく行っていますか?
ディマ

ええ、フィルターをゼロで埋め、カーネルを左上に置きます。私のすべてのPython / numpyコードは、前述のstackoverflow.comリンクにあります。複雑な分割はおそらく私の問題です。
David Poole

回答:


8

個別に対処するいくつかのサブ質問があります。

  • 空間領域での畳み込み(または時間サンプリングされた信号の時間領域での対応)は、周波数領域での乗算と同等です。サンプリングされたシステムでは、境界のケースにいくつかの微妙な点があります(つまり、DFTを使用する場合、周波数領域での乗算により、実際には線形たたみ込みではなく循環たたみ込みが得られます)が、一般に、それは本当に単純です。

  • 純粋な逆フィルタリングは、実際にはほとんど正しいソリューションではありません。ほとんどの場合、データに適用されている正確なフィルターにアクセスできないため、単純にそれを反転することはできません。フィルターを知っている場合でも、問題があります。フィルターが特定の空間周波数でゼロを持つ場合があることを考慮してください。その場合、フィルターを画像に適用した後、それらの周波数のすべての情報が失われます。そのフィルターを単純に反転すると、これらのヌルで無限(または少なくとも非常に高い)ゲインが得られます。次に、それらの周波数で追加コンテンツを含む画像にナイーブインバースを適用すると(たとえば、ノイズである可能性が高い)、その無処理コンポーネントが大幅に増幅されます。これは一般的に望ましくありません。

    この逆フィルタリングの問題は、通信システムでのイコライゼーションと非常に似ており、この現象はノイズエンハンスメントと呼ばれます。そのコンテキストでは、逆フィルターアプローチはゼロ強制イコライザーと呼ばれ、実際にはほとんど使用されません。

  • 探索している領域は、より一般的にはデコンボリューションとして知られています。原則として、デコンボリューションはトリッキーな操作です。適用された正確なフィルターを知っていて、それを元に戻したい場合でも、それは必ずしも簡単ではありません。お気づきのように、逆フィルターアプローチは通常、ウィーナーフィルターまたはシステムを正確に反転させることを目的とせず、エラー基準を最小化しながらシステムへの入力を推定する(平均-二乗誤差が一般的な目標です)。ご想像のとおり、この問題にウィーナーフィルターを適用することを、ウィーナーデコンボリューションと呼びます。


「デコンボリューション」は私にとって新しい言葉でした。私はまだ学ぶべきことがたくさんあります。ありがとう!
デビッドプール

@JasonRは、ウィーナーデコンボリューションの画像内の「トレーナー」シーケンスを知っている必要がないので、真であることがわかっているものに関してMMSE基準が最小化されますか?
スペイシー、

1
一般に、ウィーナーフィルターを設計するには、信号のパワースペクトル密度と信号に適用された伝達関数を知る必要があります。ただし、そのすべての情報がわからない可能性が高いイベントでは、逆フィルターよりも堅牢な関数構造を生成する知識に基づいた推測を行うことができます。議論については、Wikipediaページのこのセクションを参照してください。
Jason R

3

計算が行われる方法に間違いがないことを願っています-

5x5ボックスフィルターを使用して空間領域で画像をたたみ込みます。IフィルターをFFT、劣化画像をFFTし、劣化画像をフィルターで除算します。結果を画像に逆FFTすると、ゴミが発生します。

画像が256x256サイズで、フィルターが5x5であるとします。FFTを乗算してフィルターを適用するには、まずフィルターを同等のサイズに変換する必要があります。このためには、5x5ボックスフィルターを(画像の中央ではなく)「上部コーナー」に維持し、残りをゼロで埋めて256x256を満たす必要があります。フィルターのFFTは256x256になるはずです。

診断を支援するために、プログラミングステップ#1-最初に、フィルターの256x256 FFTのみを取得し、IFFT-ルーチンがフィルターを返すことができるかどうかを確認します。同じ方法で、FFT->画像自体のIFFTが逆方向に正しく動作するかどうかをテストします。

ステップ#2-乗算によってFFTドメインにフィルターのみを適用し(逆フィルターは適用しない)場合-IFFTが正常に行われた後、結果の画像を確認します。基本的にぼやけた画像でなければなりません。

すべてのプログラミングが正しい場合-FFT係数に対して1 / xを実行するときにゼロ除算のエラーがないことを確認してください。逆に、ピークが多すぎる場合、乗算により歪みが大きくなります。

一般に- 安定したフィルター、逆フィルターは明らかに不安定-これが主な理由です。ただし、理論的な制限を調査する前に、実装のクロスチェックを常に行いたいと思います。

うまくできていれば、FFT での乗算が、画像とオーディオ信号の両方のサンプル空間でのたたみ込みであることわかりました。

ディパン。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.