2009-07-11 83 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