2009-07-11 86 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赫兹,直流,无论你想调用它),所以它几乎总是迄今为止你所拍摄的任何图像的最大组件(因为像素值不能为负数,DC值将始终为正值和大)。

你需要做的是计算量值(在你从复数转换为量值/相位形式(相量记数法iirc?))后的量值(对数计算的对数计算)在你正常化它之前点。

请注意,数值在那里,它们与DC值相比非常小,取对数(使较小的值大一些,较大的值只略大一些)会使其他频率可见。

+0

非常感谢你,它现在的作品:) – jbradaric 2009-07-11 18:26:10