2009-07-11 9 views
2

私はfftwに関する課題があり、私はfftを作成するための小さなプログラムを作成しようとしていました。私はCImgを使って画像を読み書きしています。しかし、私が得るのは、単一の白い点を持つ暗い画像です。(画像のFFT

私はこれを間違った方法でやっている可能性が高いですし、誰かがこれをどうやって説明しなければならないか分かります。 、私はこれを行うための正しい方法は何か知っている必要があります。ここ

が私のコードです:。

CImg<double> input("test3.bmp"); 
CImg<double> image_fft(input, false); 

unsigned int nx = input.dimx(), ny = input.dimy(); 
size_t align = sizeof(Complex); 

array2<Complex> in (nx, ny, align); 

fft2d Forward(-1, in); 

for (int i = 0; i < input.dimx(); ++i) { 
    for (int j = 0; j < input.dimy(); ++j) { 
     in(i,j) = input(i,j); 
    } 
} 

Forward.fft(in); 

for (int i = 0; i < input.dimx(); ++i) { 
    for (int j = 0; j < input.dimy(); ++j) { 
     image_fft(i,j,0) = image_fft(i,j,1) = image_fft(i,j,2) = std::abs(in(i,j)); 
    } 
} 

image_fft.normalize(0, 255); 
image_fft.save("test.bmp"); 

答えて

5

あなたは大きさのログを取る必要があり、単一の白い点が基本値です(。 0 Hz、DC、あなたがそれを何とか呼んでいてもかまいません)、ほとんどの場合、あなたが撮った画像の中で最も大きな成分になります(ピクセル値は負ではないので、DC値は常に正です大)。

あなたがする必要があるのは、マグニチュード/マグニチュード/フェーズフォーム(フェーザー表記iirc?))に変換した後のマグニチュードのログ(ln、何らかの対数計算のタイプ)を計算することです。ポイントを正規化する前に

これらの値はDC値に比べて非常に小さく、ログを取ると(より小さい値は大きくなり、大きな値はわずかに大きくなります)、他の周波数が見えるようになります。

+0

非常にありがとう、それは今働く:) – jbradaric