画像のFFT処理でMatlabを使用しています。


Img=imread('Lenna.bmp')
をロードしまして
fft2を使って周波数とデータの関係に変換します
このままだと4隅が低周波成分ですのでfftshiftを使用して
中心を低周波にします。

そのあと、真ん中が1まわりが0の四角形を作って
変換したデータとかけることで低周波成分だけ取り出します(周波数領域でのローパス処理)

そのあと逆FFTするとぼやけたデータを得られるのですが、ここで問題です。
フィルタ演算するまえにシフトすることでデータは移動しているはずですが、
逆FFTする前に、元の位置にデータを戻さなくても、正しく画像が得られます。
元の位置に戻しても、正しく画像が得られます。

なぜ戻しても、戻さなくとも、データが得られるのかがわかりません。
FFTシフトとはいったいなんなのか、教えていただけるとありがたいです。




回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2012/02/15 23:40:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答1件)

id:ita No.1

回答回数204ベストアンサー獲得回数48

ポイント500pt

簡単のため1次元データ F[x]で考えます。
FFTしてK空間でkだけずらして逆FFTすると、F[x]はF[x]exp(ikx)に変化します。
絶対値は変化せず、複素数の位相が加わります。
なので例えばデータの実数成分を画像にすると明暗の波が出るはずですが、データの絶対値を画像にすると変化はありません。
複素数を画像にする部分がどうなっているかが問題かと思います。
http://vision.kuee.kyoto-u.ac.jp/lecture/dsp/?menu=mat_dsp

  • id:ita
    計算の詳細

    元データF1[x]
    FFTでF1[x]を G1[k]に変換
    G1[k]=Σx F1[x] exp(ikx2π/N)/√N
    G1をdkずらす
    G2[k]=G1[k+dk]
    G2を逆FFTしてF2[x]へ
    F2[x] = Σk exp(-ikx2π/N) G2[k]/√N
    = Σk exp(-ikx2π/N) G1[k+k0]/√N
    = Σk exp(-ikx2π/N) Σy F1[y] exp(i(k+k0)y2π/N)/N
    = Σy F1[y] {Σk exp(ik(y-x)2π/N)/N} exp(ik0y2π/N)
    ここで Σk {exp(ik(y-x)2π/N)}/N は x=yのとき1、それ以外で0。

    したがって
    F2[x]= F1[x] exp(ik0x2π/N)

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません