FFT de datos de imagen: "reflejo" para evitar efectos de límite

8

Cargo y muestro una imagen de un poco de arroz en Matlab:

g = imread('rice.png');
imshow(g);

arroz

Tomo la FFT de esta imagen y la cambio:

G = fft2(g);
imshow(log(abs(fftshift(G)) + 1), []);

FFT (arroz)

Si coloco los ejes ax y y en el centro de la imagen; Encuentro que la imagen es simétrica g (-x, -y) = g (x, y). Para una señal 1D tenemos que la FFT de una señal real tiene una parte real simétrica y una parte imaginaria asimétrica. Supongo que eso es lo que vemos aquí en 2 dimensiones.

Dado que la imagen original es más oscura en la parte inferior que en la superior, existe una fuerte discontinuidad horizontal en el límite periódico que causa la línea vertical en la FFT.

Quiero deshacerme de este efecto límite. Un enfoque común a esto parece ser la ventana .

Sin embargo, quiero resolver este problema con una técnica que encontré en un artículo llamado "reflejo". El documento no era muy específico, por lo que necesito su ayuda para resolver este enfoque :-).

Primero creo un "mosaico" simétrico a partir de la imagen original:

tile=[flipdim(g,2) g; flipdim(flipdim(g,1),2) flipdim(g,1)];
imshow(tile);

ingrese la descripción de la imagen aquí

Ahora tomo el FFT de este "mosaico":

Tile=fft2(tile);
imshow(log(abs(fftshift(Tile)) + 1), []) 

ingrese la descripción de la imagen aquí

La línea vertical parece haber desaparecido (casi): bien. Sin embargo, la duplicación parece haber introducido más simetría.

¿Cuál es el resultado correcto: la FFT de la imagen original o la FFT de la imagen "reflejada"?

¿Hay alguna manera de "reflejarme" para que pueda deshacerme de los efectos de límite y obtener una FFT puramente real?

Gracias de antemano por cualquier respuesta!

Andy
fuente

Respuestas:

13

La FFT de la imagen original es correcta. Los artefactos que está viendo son típicos para el DFT, porque las funciones básicas del DFT tienen dificultad para representar señales no periódicas. Aunque el DFT es de longitud finita, en realidad representa una señal periódica que se extiende al infinito negativo y positivo. Las funciones básicas de la DFT son todas sinusoides con períodos que son divisores enteros del tamaño de la DFT, por lo que todas comienzan y terminan en el mismo valor, y es difícil ajustar señales que no son periódicas de esta manera. Entonces, imagina en mosaico tu imagen: de hecho, hay una discontinuidad abrupta en los bordes. Los bordes no coinciden bien, y esa es la razón de los efectos de contorno.

En el procesamiento de la señal de audio, donde el FFT se usa con frecuencia, un enfoque muy común es usar una función de ventana , como se señaló. Esto reduce los bordes hacia 0 y reduce este efecto.

En el procesamiento de imágenes, el DCT generalmente se usa en lugar del DFT, porque impone diferentes restricciones de simetría que dan mejores resultados. En otras palabras, se usa para prevenir exactamente el problema que estás viendo. A diferencia de las funciones básicas de DFT (recuerde cómo todas comienzan y terminan en el mismo valor), las funciones básicas de DCT son divisores enteros o la mitad de divisores enteros, por lo que muchos de ellos comienzan y terminan en valores diferentes. Como resultado, las condiciones de contorno implícitas son diferentes: se supone que la señal es simétrica con respecto a sus bordes, lo que en realidad es algo similar al "reflejo" con el que estaba experimentando. Aquí hay otra publicación mía con un poco más de información sobre el DCT: https://dsp.stackexchange.com/a/362/392

Por lo tanto, como un breve resumen, si está absolutamente decidido a utilizar la FFT, es posible que desee probar la ventana. Sin embargo, la mejor opción es probablemente usar el DCT, lo que implica condiciones de contorno similares a su idea de "reflejo" y, como resultado, maneja mejor las imágenes.

schnarf
fuente
Por lo que pude entender, DFT implica una extensión periódica, mientras que DCT implica una extensión uniforme. Cuando se realiza la compresión de imágenes, se trabaja en pequeños bloques de la imagen. Dado que la extensión periódica implicada por DFT causa saltos en el borde que a su vez disminuye la tasa de convergencia; es mejor usar DCT para la compresión de imágenes (convergencia más rápida-> archivos más pequeños con la misma cantidad de información visible). Sin embargo, DCT parece ser mencionado principalmente en este contexto. El contexto en el que estoy trabajando es que quiero filtrar una imagen por un filtro Gabor. ¿Se puede hacer esto usando DCT?
Andy
Si solo desea filtrar la imagen con un filtro Gabor, debe usar la FFT. Las condiciones de contorno no serán un problema. ¿Por qué le preocupan las condiciones de contorno, o tener un espectro puramente real, para filtrar con un filtro Gabor?
schnarf
Con respecto a tener un espectro puramente real: necesito estimar las frecuencias dominantes: fu = Sum (u * G) / Sum (G) y fv, donde G (u, v) es el FFT de mi imagen g (x, y) . No entiendo cómo funciona esto si G es complejo. Me gustaría obtener un complejo fu?
Andy
En lugar de considerar los valores complejos, debe considerar sus magnitudes. Es decir, para cada frecuencia compleja bin z = a + bi, su magnitud es sqrt (a ^ 2 + b ^ 2).
schnarf
Otra cosa para pensar: puede parecer confuso que esté tomando datos reales y obteniendo un espectro complejo. El espectro complejo es solo una forma de dar a cada sinusoide una fase particular.
schnarf