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