Img=imread('Lenna.bmp')
をロードしまして
fft2を使って周波数とデータの関係に変換します
このままだと4隅が低周波成分ですのでfftshiftを使用して
中心を低周波にします。
そのあと、真ん中が1まわりが0の四角形を作って
変換したデータとかけることで低周波成分だけ取り出します(周波数領域でのローパス処理)
そのあと逆FFTするとぼやけたデータを得られるのですが、ここで問題です。
フィルタ演算するまえにシフトすることでデータは移動しているはずですが、
逆FFTする前に、元の位置にデータを戻さなくても、正しく画像が得られます。
元の位置に戻しても、正しく画像が得られます。
なぜ戻しても、戻さなくとも、データが得られるのかがわかりません。
FFTシフトとはいったいなんなのか、教えていただけるとありがたいです。
簡単のため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
コメント(1件)
元データ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)