現在、C言語で画像に2次元離散フーリエ変換を施し、高速フーリエ変換と比較しろという課題に取り組んでいます。
以下の様なプロセスで2次元フーリエ離散変換を施し、結果を表示しようと思っています。
・画像を読み込み、float型配列に入れる。
(画像は一番左上が原点とします。256×256のサイズです)
・上記のfloat型配列の、第1象限と第3象限、第2象限と第4象限を各々入れ替える。
・各行ごと、つまり、f[0][0]~f[0][255]、f[1][0]~f[1][255]、と順々)に1次元離散フーリエ変換を施す。
・上記のフーリエ変換の結果を各列ごと、つまり、f[0][0]~f[255][0],f[1][1]~f[255][1]という風に1次元離散フーリエ変換を施す。
・フーリエ変換の結果の、第1象限と第3象限、第2象限と第4象限を各々入れ替える。
・f[][]のパワースペクトル(実部の2乗+虚部の2乗の、自然対数をとったもの)を計算する。
・そのパワースペクトルとをfloat型なので、char型に置き換えて画像として出力する。
正規化等の少し細かいところは省略しました。
結果として、参考書等で見かけるもの(真ん中が直流成分で、含まれる周波数を濃淡で表したもの)になればいいのですが、上記のプロセスで大丈夫ですか?
パワースペクトルを計算した後に、何らかの移動の処理(つまり、画像の真ん中が直流成分となるような処理)を施す必要がなく、
フーリエ変換の計算の前と後に象限の入れ替えを施すだけで、直流成分が出力画像の真ん中に来るということですか?
フーリエ変換の前と後で、象限を入れ替えるだけで周波数空間では原点が真ん中になることが納得できないです。
ややこしい質問ですが、「プロセスのここが間違ってるよ」等を教えていただけると助かります。特にパワースペクトルの部分等。
よろしくお願いします。
No.2ベストアンサー
- 回答日時:
??
なんで象限の入れ替えが2回入ってるんだ?
2次元FFTの前か後どちらかで1回すればいいと思うけど。
> フーリエ変換の前と後で、象限を入れ替えるだけで周波数空間では原点が真ん中になることが納得できないです。
FFTの後で入れ替えたらDCが真ん中になるのは納得できますよね。
そのままですから・・・。
FFT前で入れ替えても同じことができます。
DFTは無限に続くデータに対して変換します。
例えば□という画像があったとして、これにフーリエ変換をかけようとするとき、変換している範囲は、□という画像の見えている範囲だけと考えるのは間違っています。
・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・
・・・・・・□□□・・・・・・
・・・・・・□□□・・・・・・
・・・・・・□□□・・・・・・
・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・無限に続く
というように□が縦横に無限に連なった画像を解析すると考えたほうがわかりやすいです。
もし□の象限が入れ替わってもx,yにオフセットするだけで同じ画像ですよね。
丁寧な解答、ありがとうございました。
http://www.ne.jp/asahi/ma-ku/104216/Excel1-2.htmlやhttp://www.metro-hs.ac.jp/rs/sinohara/dft_210/mr …というページに2回入れ替える、と書かれていましてそれを鵜呑みにして混乱してました…。
試しにエクセルで4×4行列で、
・FFTの前、後で入れ替える。
・FFTの後だけで入れ替える。
ということをしてみました。
結果は正負が所々違いましたが、値は同じでした。(実部、虚部の2乗の和は等しくなりました。)
FFT後だけ入れ替えた方が処理速度が速いですし、納得できますので、
FFT後だけ入れ替えてみます。
No.4
- 回答日時:
#2です。
ありゃ・・・(^^;そうですね。 >#3
フーリエ変換の前に入れ替えた場合、位相が回るだけでした。
DCを真ん中に持っていくにはフーリエ変換後ですね。
Tacosanさん、ICE_FALCONさん、ありがとうございました。
エクセルで試してみたところ、FFT前だけの入れ替えではダメでした。
これを機にフーリエ変換について理解を深めたいと思います
No.3
- 回答日時:
あれ? フーリエ変換の前に入れ替えてもしょうがないような気がするんですけど>#2.
「フーリエ変換して得られたスペクトルを平行移動しても同じ画像を復元できる」はずですよね.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【EXCEL VBA】ダブルクリックで...
-
背景画像の繰り返しについて
-
gif 画像上の ボタンに リン...
-
画像比較
-
Excel ユーザーフォームで表示...
-
画像のピクセルデータの取得
-
jpgファイルの内容を比較したい...
-
PowerPoint VBA で画像の鮮明度...
-
C# 画像のトリミング処理
-
DXライブラリの、マウスを使っ...
-
VBAのユーザーフォームのイメー...
-
HTMLで画像をポップアップで表...
-
UWSCで指定した画像が来たとき...
-
OpenCVで出力を24bitのbmpにす...
-
画像処理したBitmapをピクチャ...
-
C#で画像を他の画像に貼り付け...
-
UWSC「画像が無い場合」
-
スマホでサイトの画像を長押し→...
-
C# VisualStudioでプロジェクト...
-
vb.net 画像の透過について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
HTMLでこの画像を表示したいで...
-
背景画像の繰り返しについて
-
HTMLです。画像をHTMLで表した...
-
【EXCEL VBA】ダブルクリックで...
-
jqueryスライダーを2段でスライ...
-
UWSC 画像認識で条件分岐
-
EXCEL VBA 複数のImageコントロ...
-
UWSC 画像判定と条件分岐について
-
PowerPoint VBA で画像の鮮明度...
-
gif 画像上の ボタンに リン...
-
「using Windows」でエラーが出る
-
Excel ユーザーフォームで表示...
-
vb.net 画像の透過について
-
UWSC「画像が無い場合」
-
uwcs のマクロで画像認識をして...
-
UWSCの画像認識と条件分岐につ...
-
uwscの画像認識に失敗します。
-
画像処理したBitmapをピクチャ...
-
VBA シート毎に画像挿入
-
VBAのユーザーフォームのイメー...
おすすめ情報