2016-01-26 1 views
1

J'essaie d'implémenter l'approche spectrale pour calculer une carte de saillance pour une image, mais je ne peux pas sembler obtenir la FFT inverse fonctionne.CImg - Get FFT inverse d'une image

int main(int argc, char * argv[]) { 

    const char * input_file = "img/pic.png"; 

    CImg<unsigned char> * input = new CImg<unsigned char>(input_file); 

    resize_fft(*input); //Resize the image for the FFT 
    CImg<unsigned char> gray = any2gray(*input); //to single-channel grayscale image 
    free(input); 

    CImgList<unsigned char> fft = gray.get_FFT(); 
    CImg<unsigned char>::FFT(fft[0], fft[1], true); 
    fft[0].save("img/fft.png"); 

    return 1; 
} 

À la fin, fft.png est juste un fichier image noir. Je ne peux pas trouver un exemple de n'importe quel calcul inverse FFT utilisant CImg ... Quelqu'un at-il la moindre idée?

Merci beaucoup! Robin

+0

Avez-vous essayé normalisant, ou le contraste étirement le résultat - ils sont généralement très sombre ... –

Répondre

1

Un problème commun qui peut survenir pour une large gamme d'images est que la FFT de l'image ne peut pas être représentée (ou perdre trop d'informations pour une utilisation pratique) avec la plage limitée de unsigned char. Vous pouvez éviter cela en effectuant les calculs de FFT avec une float intermédiaire d'image:

// convert from unsigned char to float to support larger range of values 
CImg<float> fft_in = gray; 

// Forward transform 
CImgList<float> fft = fft_in .get_FFT(); 

// Inverse transform 
CImg<float>::FFT(fft[0], fft[1], true); 

// Normalize back to unsigned char range (0,255) and save 
fft[0].normalize(0,255).save("img/fft.png"); 
+0

Ouais, c'était. Maintenant que j'y pense, ça semble logique ... Merci beaucoup! – user3360437