Estoy tratando de FFT una imagen usando la biblioteca de http://www.fftw.org/ para que pueda hacer una convolución en el dominio de la frecuencia. Pero no puedo encontrar la manera de hacerlo funcionar. Para entender cómo hacer esto, estoy tratando de enviar FFT una imagen como una matriz de pixelcolors y luego hacia atrás FFT para obtener la misma matriz de pixelcolors. Esto es lo que hago:Adelante FFT una imagen y FFT hacia atrás una imagen para obtener el mismo resultado
fftw_plan planR, planG, planB;
fftw_complex *inR, *inG, *inB, *outR, *outG, *outB, *resultR, *resultG, *resultB;
//Allocate arrays.
inR = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * width * width);
inG = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * width * width);
inB = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * width * width);
outR = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * width * width);
outG = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * width * width);
outB = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * width * width);
resultR = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * width * width);
resultG = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * width * width);
resultB = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * width * width);
//Fill in arrays with the pixelcolors.
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
int currentIndex = ((y * width) + (x)) * 3;
inR[y * width + x][0] = pixelColors[currentIndex];
inG[y * width + x][0] = pixelColors[currentIndex + 1];
inB[y * width + x][0] = pixelColors[currentIndex + 2];
}
}
//Forward plans.
planR = fftw_plan_dft_2d(width, width, inR, outR, FFTW_FORWARD, FFTW_MEASURE);
planG = fftw_plan_dft_2d(width, width, inG, outG, FFTW_FORWARD, FFTW_MEASURE);
planB = fftw_plan_dft_2d(width, width, inB, outB, FFTW_FORWARD, FFTW_MEASURE);
//Forward FFT.
fftw_execute(planR);
fftw_execute(planG);
fftw_execute(planB);
//Backward plans.
planR = fftw_plan_dft_2d(width, width, outR, resultR, FFTW_BACKWARD, FFTW_MEASURE);
planG = fftw_plan_dft_2d(width, width, outG, resultG, FFTW_BACKWARD, FFTW_MEASURE);
planB = fftw_plan_dft_2d(width, width, outB, resultB, FFTW_BACKWARD, FFTW_MEASURE);
//Backward fft
fftw_execute(planR);
fftw_execute(planG);
fftw_execute(planB);
//Overwrite the pixelcolors with the result.
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
int currentIndex = ((y * width) + (x)) * 3;
pixelColors[currentIndex] = resultR[y * width + x][0];
pixelColors[currentIndex + 1] = resultG[y * width + x][0];
pixelColors[currentIndex + 2] = resultB[y * width + x][0];
}
}
Podría alguien por favor me muestran un ejemplo de cómo enviar una imagen FFT FFT y luego hacia atrás la imagen utilizando FFTW para obtener el mismo resultado? He estado viendo muchos ejemplos que muestran cómo usar FFTW para FFT, pero no puedo entender cómo se aplica a mi situación donde tengo una matriz de pixelcolors que representa una Imagen.