2009-07-11 13 views
2

J'ai une affectation à propos de fftw et j'essayais d'écrire un petit programme pour créer un fft d'une image. J'utilise CImg pour lire et écrire des images. Mais tout ce que je reçois est une image sombre avec un seul point blanc :(FFT d'une image

Je vais très probablement le faire dans le mauvais sens et j'apprécierais que quelqu'un puisse expliquer comment cela devrait être fait. Je n'ai pas besoin du code , j'ai juste besoin de savoir quelle est la bonne façon de le faire

Voici mon code:.

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

Répondre

5

Vous devez prendre le journal de l'ampleur le seul point blanc est la valeur de base (. 0 Hz, DC, peu importe ce que vous voulez l'appeler), donc il sera presque TOUJOURS de loin le plus grand composant de toute image que vous prenez (Puisque les valeurs de pixel ne peuvent pas être négatives, la valeur DC sera toujours positive et grand). Ce que vous devez faire est de calculer le log (ln, quel que soit, un certain type de calcul logarithmique) de la magnitude (donc après que vous avez converti du complexe à la magnitude/phase forme (phairc notation iirc?)) Sur chaque point avant de le normaliser. S'il vous plaît noter que les valeurs sont là, elles sont juste vraiment petites par rapport à la valeur DC, en prenant le journal (qui rend les petites valeurs plus grandes, et les plus grandes valeurs seulement légèrement plus grandes) rendront les autres fréquences visibles.

+0

Merci beaucoup, ça marche maintenant :) – jbradaric