7

FFTを使用して周波数領域に変換したい画像があります。Java用のライブラリが不足しているようですが、2つ見つかりました。1つはJTransformsで、もう1つはあまり知られておらず、名前がありません。

あまり知られていないものでは、2Dは2の累乗の長さの値しか持つことができませんでしたがFastFourierTransform.fastFT(real, imaginary, true);、実際にはすべてのピクセル値でいっぱいのdoubleの2D配列であり、虚数部は同じサイズの2D配列であるような方法を使用するのは簡単でしたゼロの。ブール値は、順方向または逆方向の変換に依存します。これは私にとって理にかなっており、私が行った変換を台無しにする2つの要件の力を除いて機能しました(最初に画像の周りに黒いスペースを追加して、最も近い2の力に合わせました)、私が苦労しているのはどのように解決するかですJTransformsと同等のメソッドを使用し、その際のガイダンスをいただければ幸いです。私が現在行っていることを述べます。

関連するクラスはだと思いますDoubleFFT_2D。そのコンストラクターは、画像の幅と高さであると想定するいくつかの行と列を取ります。doubleFFT.realForwardFull(real);私の画像には虚数部がないので、虚数部をゼロとして扱い、ピクセルでいっぱいの実際の2D配列を渡す使用できると思います。残念ながら、これはまったく機能しません。JavaDocは次のように述べthe input array must be of size rows*2*columns, with only the first rows*columns elements filled with real dataていますが、これが私のイメージにどのように関連しているか、そしてこの要件を満たすために何をしなければならないかはわかりません。

長くて貧弱な説明について申し訳ありませんが、追加情報が必要な場合は、喜んで提供させていただきます。

JTransformsライブラリとドキュメントはここにあります:https ://sites.google.com/site/piotrwendykier/software/jtransforms

4

1 に答える 1

6

JTransformsのドキュメントがzip形式のダウンロード以外にオンラインで入手できないのは残念です。それは非常に完全で役に立ちます、あなたはそれをチェックするべきです!

あなたの質問に答えるには:DoubleFFT_2D.realForwardFull(double[][] a)実数(あなたのピクセル)の配列を取ります。ただし、FFTの結果には、入力値ごとに2つの出力値があります。各周波数ビンの実数部と虚数部です。これが、入力配列が実際の画像配列の2倍の大きさで、半分が空であるかゼロで埋められている必要がある理由です。

すべてのFFT関数aは入力だけでなく出力にも使用することに注意してください。これは、そこにある画像データが失われることを意味するため、とにかく別の/より大きな配列にコピーすることが望ましい場合があります。

シナリオの簡単で明白な修正は、DoubleFFT_2D.realForward(double[][] a)代わりに使用することです。これは、負の側が対称になるため、正のスペクトルのみを計算します。これは、入力値が実際のものであるためです。

また、RealFFTUtils_2DJTransformsのクラスを確認してください。これにより、後で配列から結果を取得するのがはるかに簡単になります:)

于 2013-05-19T11:37:22.480 に答える