2016-05-12 2 views
0

J'ai un problème avec l'image que je crée en utilisant FFT et IFFT. C'est l'image que je convertis: oryginal image, et voici celle que j'obtiens après FFT et IFFT: output image. Je suppose que la conversion de phase est bonne, et le problème est quelque part dans la conversion de magnitude. Ci-dessous, une partie de ma fonction FFT pour le canal rouge en boucle pour chaque pixel, outr est sortie de la fonction de fftw_plan_dft_2d et magRMax est la valeur maxiumum de toutes les grandeurs:Image floue après IFT en utilisant la bibliothèque FFTW dans QT C++

realR = outR[tempCounter][0]/(double)(squareSize * squareSize); 
imagR = outR[tempCounter][1]/(double)(squareSize * squareSize); 
... 
magR = sqrt((realR * realR) + (imagR * imagR)); 
... 
int param = 255; 
magR = (param*log(magR+1))/log(1 + magRMax); 
... 
magR = (magR > 255 ? 255 : magR); 
... 
magR = (magR < 0 ? 0 : magR); 
... 
tempColor.setRed((int)magR); 

pixels nouveaux sont affectés à l'image d'amplitude. Après la FFT et la création d'une magnitude, les images de phase que j'essaie de faire IFFT sans aucun changement de magnitude à mi-temps, les images de phase. Ci-dessous, une partie de ma fonction IFFT pour chanell rouge:

planR = fftw_plan_dft_2d(squareSize, squareSize, inR, outR, FFTW_BACKWARD, FFTW_ESTIMATE); 
... 
tempColor.setRgb(myImageMag->pixel(i,j)); 
tempColor2.setRgb(myImagePhase->pixel(i,j)); 

magR = tempColor.red()/255.0; 
phaseR = ((tempColor2.red()/255.0) * 2 * M_PI) - M_PI; 
inR[tempCounter][0] = (magR * cos(phaseR)); 
inR[tempCounter][1] = (magR * sin(phaseR)); 
... 
redMax += abs(redMin); 
... 
red = (int)(outR[tempCounter][0]); 
... 
red = ((red + abs(redMin))/(double)redMax)*255.0; 
... 
tempColor.setRed(red); 

RedMAX est la valeur maximale de tous les pixels de outr [tempCounter] [0], redMin est la valeur min de tous les pixels de outr [tempCounter] [0]. redMax + = abs (redMin) est en train de s'écrouler, parce que j'ai des valeurs inférieures à 0, j'ai aussi effacé toutes les valeurs rouges.

code à programmer sur GitHub:

https://github.com/Hariver/POID/blob/master/main.cpp 

Répondre

0

pixels floues signifient simplement que chaque pixel est étalée dans le domaine spatial (une convolution). Les circonvolutions dans le domaine spatial sont des multiplications dans le domaine des fréquences, ce qui semble être ce que vous faites.