Frecuencia de centrado cero para la transformada discreta de Fourier

11

Estoy trabajando en una aplicación de procesamiento de imágenes que utiliza una transformación discreta de Fourier para implementar el desenfoque / nitidez. La aplicación funciona más o menos, pero algo sobre la mecánica sigue siendo confuso para mí.

En particular, es cómo se realiza el proceso de centrar las frecuencias cero.

El ejemplo que he visto preprocesa la imagen de entrada (de intensidades en escala de grises) multiplicándola con una matriz de tamaño igual a la imagen de entrada, cuyos valores son , donde x es la fila, y es la columna, entonces un patrón alternando 1 y - 1(1)x+yxy11

Según las notas, esto es equivalente a intercambiar los cuadrantes de la matriz volteando a través de los ejes e y .xy

Entiendo por qué se hace esto, y me gustaría enfatizar que entiendo que tengo mi código / Fourier funcionando, simplemente no entiendo por qué multiplicar la matriz de entrada por 1 / -1 termina centrando el componente de frecuencia cero alrededor de 0.

Gracias

mareado
fuente
También puede encontrar alguna referencia en el Capítulo 4, 4.6-Implementación del procesamiento de imágenes digitales de González (tengo una segunda edición). Espero eso ayude.
hakunami el

Respuestas:

18

Oh! ¡Qué buen truco! Funciona debido al teorema de convolución (es decir, la multiplicación en el dominio espacial / temporal es equivalente a la convolución en el dominio de frecuencia).

xy

Aquí está una imagen de prueba: imagen de prueba. Su transformación de Fourier se ve así:transformada de Fourier de la imagen de prueba

Si se toma la transformada de Fourier de la imagen alterna ( imagen de tablero de ajedrez), que se traduce en un solo punto a la derecha en el centro de la transformada de Fourier: ingrese la descripción de la imagen aquí. (Recuerde que todavía no hemos hecho nuestra rotación, por lo que el centro de la transformación de Fourier son las frecuencias altas y las frecuencias bajas todavía están en las esquinas). Pero este es el "núcleo de rotación". Convolucionarse con este núcleo de rotación mueve todo hacia abajo y hacia la derecha (pero las cosas que caen desde la parte inferior derecha giran hacia la parte superior izquierda).

Convolución de la imagen original con el kernel de rotación (en el dominio de la imagen) le ofrece: imagen enrevesada, mientras que la convolución de la transformada de Fourier de imágenes con el kernel de rotación (en el dominio de la frecuencia) le da: transformada de Fourier rotada.

Y podemos comprobar que la multiplicación de la TestImage por el tablero de ajedrez en el dominio de la imagen da imagen de multiplicación, que tiene una transformada de Fourier: transformada de Fourier nuevamente rotada.

Lógica Errante
fuente
Estoy confundido. Esto está usando convolución para implementar una fftshiftfunción similar? ¿No es computacionalmente más barato reorganizar los 4 cuadrantes directamente?
endolito
2
No hay convolución directa aquí. Esto está utilizando la multiplicación en píxeles en el dominio de la imagen para obtener el equivalente de una convolución en el dominio de Fourier. Sí, fftshiftno es muy costoso, pero este truco podría tener un mejor comportamiento de caché. La multiplicación por píxeles en realidad solo está cambiando el signo de cada otro píxel. Tan fácil de vectorizar, la escritura de lectura-modificación-escritura es un acierto de caché garantizado, y es fácil para el procesador captar previamente las lecturas.
Wandering Logic
Ah, claro, es un cambio de signo, no una multiplicación real.
Endolito
¿Por qué la transformación de Fourier de la imagen de prueba (la segunda imagen) se ve así? De hecho, veo dos imágenes, una negra sobre la otra.
hakunami el
10

La respuesta de Wandering Logic es correcta y detallada. Solo pensé que querrías ver algunas matemáticas en lugar de fotos:

(1)k=ejωω2π(k/2)

El efecto es que la frecuencia cero, que antes estaba en el índice 0, ahora está a la mitad del ancho de la imagen (o altura, dependiendo de si multiplica las columnas o las filas).

nimrodm
fuente