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
Según las notas, esto es equivalente a intercambiar los cuadrantes de la matriz volteando a través de los ejes e y .
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
fuente
Respuestas:
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).
Aquí está una imagen de prueba: . Su transformación de Fourier se ve así:
Si se toma la transformada de Fourier de la imagen alterna ( ), que se traduce en un solo punto a la derecha en el centro de la transformada de Fourier: . (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: , 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: .
Y podemos comprobar que la multiplicación de la TestImage por el tablero de ajedrez en el dominio de la imagen da , que tiene una transformada de Fourier: .
fuente
fftshift
función similar? ¿No es computacionalmente más barato reorganizar los 4 cuadrantes directamente?fftshift
no 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.La respuesta de Wandering Logic es correcta y detallada. Solo pensé que querrías ver algunas matemáticas en lugar de fotos:
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).
fuente