Pregunta

Tengo una misión sobre fftw y yo estaba tratando de escribir un pequeño programa para crear una FFT de una imagen. Estoy usando CImg a leer y escribir imágenes. Pero todo lo que consigo es una imagen oscura con un único punto blanco: (

Estoy muy probablemente haciendo esto por el camino equivocado y apreciaría si alguien podría explicar cómo esto debe hacerse. No necesito el código, sólo hay que saber cuál es la forma correcta de hacer esto.

Aquí está mi código:

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");
¿Fue útil?

Solución

Es necesario tomar el logaritmo de la magnitud. El punto blanco solo es el valor base (0 Hz, DC, como se quiera llamar), por lo que casi siempre será, con mucho, el componente más importante de cualquier imagen que tome (Dado que los valores de píxeles no pueden ser negativos, el valor de CC se siempre será positivo y grande).

Lo que hay que hacer es calcular el log (ln, lo que sea, algún tipo de cálculo logarítmico) de la magnitud (así que después de que haya convertido a la forma del complejo de magnitud / fase (IIRC notación fasorial?)) En cada punto antes de normalizarla.

Tenga en cuenta que los valores están ahí, que son simplemente muy pequeño en comparación con el valor de CC, teniendo el registro (que hace que los valores más pequeños más grandes por una gran cantidad, y los valores más grandes sólo ligeramente mayor) hace que las otras frecuencias visibles.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top