6

画像の畳み込みにFFTWを使用しようとしています。

まず、システムが正常に動作しているかどうかをテストするために、fft を実行し、次に逆 fft を実行したところ、まったく同じ画像が返されました。

次に、少し前進して、ID カーネルを使用しました (つまり、kernel[0][0] = 1 に対して、他のすべてのコンポーネントは 0 に等しい)。画像とカーネル (両方とも周波数領域) の間の成分ごとの積を取り、逆 fft を実行しました。理論的には、同じ画像を取り戻すことができるはずです。しかし、私が得た結果は、元の画像に近いものではありません。これは、周波数領域に fft する前にカーネルを中央に配置したことに関係していると思われます (カーネル [0] [0] に「1」を配置したため、基本的には正の部分を上部の中央に配置したことを意味します)。左)。ここで何がうまくいかないのか、誰か教えてもらえますか?

4

3 に答える 3

3

各次元のサンプルのインデックスは、-n / 2 ... 0 ... n / 2 -1である必要があるため、次元が奇数の場合は、中央を中心にします。次元が偶数の場合は、新しい0の前に新しい0の後よりも1つのサンプルが多くなるように中央に配置します。

例:幅/高さが8の場合は-4、-3、-2、-1、0、1、2、3、幅/高さがの場合は-3、-2、-1、0、1、2、3 7。

FFTは中央を基準にしており、そのスケールには負の点があります。
メモリ内のポイントは0...n-1ですが、FFTはそれらを-ceil(n / 2)... floor(n / 2)として扱います。ここで、0は-ceil(n / 2)およびn-です。 1はフロア(n / 2)

単位行列は、0,0の位置に1があるゼロの行列です(中央-上記の番号付けによる)。(空間領域で。)

周波数領域では、単位行列は定数である必要があります(すべての実数値1または1 /(N * M)およびすべての虚数値0)。

この結果が得られない場合は、識別マトリックスのパディングが異なる場合があります(すべての辺ではなく、左と下)。これはFFTの実装によって異なる場合があります。

各ディメンションを個別に中央揃えします(これはインデックスの中央揃えであり、実際のメモリに変更はありません)。

おそらく、画像を(中央揃え後に)各次元で2の累乗にパディングする必要があります(2 ^ n * 2 ^ m、nはmと等しくなくてもかまいません)。

ソース画像と宛先画像の両方で中心ベースのインデックスを使用して、既存のピクセルを新しい大きな画像にコピーすることにより、FFTの0,0の位置(角ではなく中心)を基準にしてパディングします(例:(0,0)から(0,0)) 、(0,1)から(0,1)、(1、-2)から(1、-2))

FFTが複雑なセルではなく通常の浮動小数点セルを使用すると仮定すると、2の累乗が必要ない場合でも、複雑な画像のサイズは2 * ceil(2 / n)* 2 * ceil(2 / m)である必要があります。 (サンプルが半分あるためですが、サンプルは複雑です)。

画像に複数のカラーチャネルがある場合は、最初に画像の形状を変更して、チャネルがサブピクセルの順序で最も重要ではなく、最も重要になるようにする必要があります。時間とスペースを節約するために、一度に形を変えてパッドを入れることができます。

IFFTの後のFFTSHIFTを忘れないでください。(象限を交換します。)
IFFTの結果は0...n-1です。ピクセルfloor(n / 2)+1..n-1を取得し、0 ... floor(n / 2)の前に移動する必要があります。
これは、ピクセルを新しいイメージにコピーし、floor(n / 2)+1をメモリ位置0にコピーし、floor(n / 2)+2をメモリ位置1にコピーし、...、n-1をメモリ位置にコピーすることによって行われます。 location floor(n / 2)、次に0からmemory-location ceil(n / 2)、1からmemory-location ceil(n / 2)+1、...、floor(n / 2)からmemory-location n -1。

周波数領域で乗算する場合、サンプルは複雑であるため(1セルは実数、次に1セルは虚数)、複雑な乗算を使用する必要があることに注意してください。

結果は、N ^ 2 * M ^ 2で除算する必要がある場合があります。ここで、Nはパディング後のnのサイズです(Mとmの場合も同様です)。-これは、(a。単位行列の周波数領域の値を確認するb。結果を入力と比較する)ことでわかります。

于 2012-06-25T20:17:40.580 に答える
0

Identity カーネルに対するあなたの理解がずれている可能性があると思います。Identity カーネルは、0, 0 の位置ではなく、2D カーネルの中心に 1 を持つ必要があります。

3 x 3 の例では、次のように設定します。

1, 0, 0
0, 0, 0
0, 0, 0

そのはず

0, 0, 0
0, 1, 0
0, 0, 0

こちらもチェック

「何もしない」畳み込みカーネルとは

3 ページの下部にあるこちらもご覧ください。

http://www.fmwconcepts.com/imagemagick/digital_image_filtering.pdf

于 2012-06-25T19:26:30.967 に答える
-1

周波数領域で画像とカーネルの間の成分ごとの積を取り、逆 fft を実行しました。理論的には、同じ画像を取り戻すことができるはずです。

非 fft カーネルで前方変換を行ってから逆 fft 変換を行うと、元の画像が返されるという期待につながるとは思いませんが、おそらくあなたが言おうとしていることを誤解しているだけです。 ..

于 2012-06-25T19:49:56.987 に答える