Filtrado de Fourier para eliminación de ruido - Procesamiento de imágenes en el dominio de frecuencia
Transformada de Fourier y representación frecuencial de imágenes
La transformada de Fourier convierte imágenes del dominio espacial al dominio de frecuencia, revelando la distribución de los diferentes componentes frecuenciales en la imagen. Esto proporciona una herramienta poderosa para el procesamiento basado en características de frecuencia.
Conceptos básicos:
- Baja frecuencia: regiones de la imagen con cambios lentos de brillo (áreas uniformes grandes, gradientes). Representan la estructura general y la distribución de luminosidad
- Alta frecuencia: regiones con cambios rápidos (bordes, texturas, ruido). Representan detalles y transiciones abruptas
- Espectro: magnitud de la FFT 2D, con baja frecuencia (componente DC) en el centro y frecuencia creciente hacia el exterior
DFT 2D (Transformada Discreta de Fourier):
- Convierte una imagen MxN en una matriz compleja MxN
- La magnitud de cada número complejo representa la intensidad de esa frecuencia; la fase representa la información posicional
- Se calcula eficientemente con el algoritmo FFT, con complejidad O(N log N)
Filtros paso bajo - Fundamentos de eliminación de ruido
Los filtros paso bajo conservan los componentes de baja frecuencia (estructura de la imagen) y suprimen los de alta frecuencia (ruido y detalles). Es el método más básico de eliminación de ruido en el dominio frecuencial.
Filtros paso bajo comunes:
- Paso bajo ideal: paso completo dentro de la frecuencia de corte, bloqueo total fuera. Produce efecto de ringing (fenómeno de Gibbs)
- Paso bajo Butterworth: transición suave, atenuación de 3dB en la frecuencia de corte para orden n. Mayor orden se aproxima más al filtro ideal
- Paso bajo gaussiano: función gaussiana como función de transferencia, sin efecto de ringing. Equivalente al desenfoque gaussiano en el dominio espacial
Flujo de filtrado en dominio frecuencial:
- Aplicar FFT a la imagen para obtener el espectro
- Multiplicar elemento a elemento el espectro por la función de transferencia del filtro
- Aplicar FFT inversa para obtener la imagen filtrada
Selección de frecuencia de corte: demasiado baja produce excesivo desenfoque (pérdida de detalles); demasiado alta resulta en eliminación de ruido insuficiente. Generalmente se determina experimentalmente o basándose en las características frecuenciales del ruido.
Filtros paso alto y paso banda
Los filtros paso alto conservan las altas frecuencias (bordes, detalles) y suprimen las bajas (fondo). Los filtros paso banda conservan solo un rango específico de frecuencias.
Filtro paso alto:
- Función de transferencia = 1 - función de transferencia paso bajo
- Efecto: extrae bordes y detalles, elimina el fondo uniforme
- Aplicación: realce de bordes, nitidez (imagen original + resultado paso alto = imagen nítida)
Filtro paso banda:
- Conserva solo los componentes dentro de un rango de frecuencias específico
- Implementación: paso alto (corte bajo) × paso bajo (corte alto)
- Aplicación: extracción de texturas a escala específica, análisis de estructuras periódicas
Filtro de rechazo de banda (notch):
- Suprime un rango de frecuencias específico, conservando el resto
- Usado para eliminar ruido periódico de frecuencia conocida (como líneas de escaneo, moiré)
Filtros notch - Eliminación de ruido periódico
El filtro notch suprime picos de ruido en posiciones específicas del espectro, siendo el método más efectivo para eliminar ruido periódico.
Fuentes de ruido periódico:
- Interferencia electromagnética (como interferencia de red eléctrica 50/60Hz)
- Vibraciones mecánicas de dispositivos de escaneo
- Moiré (interferencia entre dos patrones periódicos)
- Ruido de patrón fijo del sensor
Flujo de filtrado notch:
- Aplicar FFT a la imagen y observar el espectro
- Identificar los picos frecuenciales correspondientes al ruido (aparecen como puntos brillantes en el espectro)
- Colocar notches en esas posiciones (establecer la magnitud a 0 o atenuarla significativamente)
- Aplicar FFT inversa para recuperar la imagen sin ruido
Forma del notch: puede ser circular (suprime una frecuencia específica), en banda (suprime frecuencias en una dirección específica) o de forma personalizada. Usar atenuación gaussiana en lugar de corte abrupto reduce los artefactos.
Filtro de Wiener y filtrado inverso
El filtro de Wiener maneja simultáneamente la eliminación de ruido y el desenfoque en el dominio frecuencial, siendo el filtro lineal óptimo (en el sentido de mínimo error cuadrático medio).
Filtrado inverso:
- Divide directamente por la función de degradación (transformada de Fourier de la PSF) para recuperar la imagen original
- Problema: en frecuencias donde el espectro de la PSF se acerca a cero, el ruido se amplifica enormemente
- Prácticamente inutilizable en la práctica, excepto con ruido extremadamente bajo
Filtro de Wiener:
- Añade regularización del espectro de potencia del ruido sobre la base del filtrado inverso
- Reduce automáticamente la ganancia de restauración en frecuencias donde el espectro de la PSF es pequeño, evitando la amplificación del ruido
- Requiere estimar la relación señal-ruido (SNR) o el espectro de potencia del ruido
- Es el mejor compromiso lineal entre eliminación de desenfoque y ruido
Estimación de parámetros: el espectro de potencia del ruido puede estimarse a partir de regiones planas de la imagen. El espectro de potencia de la señal puede aproximarse con modelos estadísticos de imágenes naturales (decaimiento 1/f). En la práctica, a menudo se simplifica con un único parámetro K (relación potencia ruido/señal).
Guía de implementación - Filtrado de Fourier en Python
Implementación del filtrado de imágenes en el dominio frecuencial usando NumPy y OpenCV en Python.
Flujo básico:
import numpy as np, cv2- FFT:
f = np.fft.fft2(img); fshift = np.fft.fftshift(f) - Crear filtro (máscara del mismo tamaño que la imagen)
- Aplicar filtrado:
filtered = fshift * mask - FFT inversa:
result = np.abs(np.fft.ifft2(np.fft.ifftshift(filtered)))
Creación de filtro paso bajo gaussiano:
- Crear coordenadas de malla del mismo tamaño que la imagen
- Calcular la distancia de cada punto al centro
- Aplicar función gaussiana:
mask = np.exp(-(dist**2) / (2 * sigma**2))
Consideraciones:
- Rellenar con ceros antes de la FFT (extender a potencia de 2) acelera el cálculo y evita la convolución circular
fftshiftmueve la frecuencia cero al centro, facilitando el diseño de filtros simétricos- Después del filtrado, tomar la parte real o la magnitud, descartando la parte imaginaria mínima (error numérico)
cv2.dftde OpenCV es más rápido quenp.fft.fft2de NumPy para imágenes grandes