2

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

私はこれを間違った方法で行っている可能性が高いので、誰かがこれをどのように行うべきかを説明していただければ幸いです。コードは必要ありません。これを行う正しい方法を知る必要があります。

これが私のコードです:

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");
4

1 に答える 1

5

マグニチュードの対数を取る必要があります。単一の白い点は基本値(0 Hz、DC、あなたがそれを呼びたいものは何でも)であるため、それはほとんど常にあなたが撮る画像の中ではるかに最大の成分になります(ピクセル値は負になることができないので、DC値は常に前向きで大きくなります)。

あなたがする必要があるのは、正規化する前に、各ポイントの大きさの対数(ln、なんでも、ある種の対数計算)を計算することです(したがって、複素数から大きさ/位相形式(フェーザ表記iirc?)に変換した後)それ。

値がそこにあることに注意してください。これらはDC値と比較して非常に小さいため、ログを取得すると(小さい値は大幅に大きくなり、大きい値はわずかに大きくなります)、他の周波数が表示されます。

于 2009-07-11T18:23:07.420 に答える