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 值将总是积极的和大的)。

您需要做的是在标准化之前计算每个点的幅度(因此在您从复数转换为幅度/相位形式(相量符号iirc?)之后)的对数(ln,无论如何,某种类型的对数计算)它。

请注意,这些值是存在的,与 DC 值相比,它们真的很小,取对数(这会使较小的值大很多,而较大的值只会稍微大一点)将使其他频率可见。

于 2009-07-11T18:23:07.420 回答