Transformada de Fourier para series de tiempo Sobre convolución de imágenes y SciPy
Transformada de Fourier para series de tiempo y convolución de imágenes con SciPy
La convolución de transformada de Fourier también se aplica a imágenes
Esta publicación es la segunda parte de la transformada de Fourier para series de tiempo, revisa la primera parte aquí:
Transformada de Fourier para series de tiempo: convolución rápida explicada con numpy
Convolución 10000 veces más rápida usando la transformada de Fourier
towardsdatascience.com
Revisión rápida de la publicación anterior
En la primera publicación, expliqué cómo se puede utilizar la transformada de Fourier para convolucionar señales de manera muy eficiente. Mostré que la convolución utilizando la transformada de Fourier en numpy es muchas órdenes de magnitud más rápida que el enfoque algebraico estándar, y que corresponde a un cierto tipo de convolución llamada convolución circular.
En esta publicación, quiero enfatizar lo que significa la convolución circular y cómo se aplica todo a las imágenes. Las imágenes también son una buena manera de extender la intuición de 1 dimensión a 2 dimensiones.
- 5 Preocupaciones en torno a la Escalabilidad y Adopción de la IA
- ¿Es ChatGPT realmente inteligente?
- Liberando la Inteligencia Artificial Generativa con VAEs, GANs y Transformadores
Todas las imágenes fueron creadas por el autor.
Convolución de imágenes con scipy
Si alguna vez has trabajado con imágenes para el procesamiento de imágenes, es muy probable que hayas encontrado funciones para aplicar convolución. La convolución de imágenes se utiliza en todas partes: mejora de imágenes, eliminación de ruido, segmentación, extracción de características, compresión, y es la base de las Redes Neuronales Convolucionales, el estándar de oro de los modelos de aprendizaje profundo para procesar datos visuales.
En Python, la convolución de imágenes se puede hacer de manera bastante sencilla utilizando scipy y su subpaquete ndimage. En este punto, recomiendo echar un vistazo rápido a la documentación de la función `convolve` y luego regresar aquí.
scipy.ndimage.convolve – Manual de SciPy v1.11.1
Convolución multidimensional. La matriz se convoluciona con el núcleo dado. Parámetros: La matriz de entrada. Matriz de…
docs.scipy.org
El uso es muy simple: puedes pasar dos imágenes para convolucionarlas juntas. Veamos un ejemplo:
Ten en cuenta que scipy propone varias formas de manejar los límites utilizando el parámetro ‘mode’: como veremos a continuación, el modo ‘wrap’ corresponde a la convolución circular y, por lo tanto, a la convolución utilizando un enfoque de transformada de Fourier. También existen otros enfoques, como ‘reflect’ que refleja las imágenes de adentro hacia afuera, o ‘constant’ que repite el valor más externo. Observa también cómo funciona ‘wrap’: repite toda la señal, como si fuera periódica.
Convolución de imágenes 2D
Comencemos a codificar para ver las diferencias entre los diferentes modos de convolución.
Primero, creamos una clase para representar imágenes periódicas 2D: recuerda de la publicación anterior que al utilizar la herramienta de transformada de Fourier, las señales se consideran periódicas. Esta clase es solo azúcar sintáctico para trazar esos arreglos periódicos 2D.
Mostramos la imagen “base” en el rectángulo [0, V, 0, H], así como sus 8 primeras réplicas alrededor. Como se mencionó en la publicación anterior, la señal se considera periódica, por lo tanto, con soporte infinito, pero solo necesitamos y usamos un solo período.
Ahora creemos una imagen de muestra para jugar: debe contener ruido aleatorio, un patrón sinusoidal, un patrón de pendiente y algunos puntos cuadrados. También creamos la versión periódica de esta imagen de muestra: representa la imagen periódica que la transformada de Fourier considera al aplicar sus operadores:
![Imagen de entrada que vamos a convolucionar, representada como un arreglo periódico. La imagen “base” está en el centro, con sus réplicas alrededor.](https://miro.medium.com/v2/resize:fit:640/format:webp/1*7zLyvYX17liXpDXTOBfhTg.png)
Ahora creemos un núcleo para usar en la convolución: usaremos un núcleo constante simple, también llamado núcleo de promediado ya que la convolución con este núcleo solo da el promedio local de la imagen de entrada.
Luego comenzamos a jugar con la función de convolución de scipy y sus diferentes modos para manejar los límites, y envolvimos el resultado como una matriz periódica para facilitar la representación gráfica: observe cómo el centro de la imagen convolucionada siempre es el mismo sin importar el modo utilizado, pero los límites varían.
![Resultados de 4 tipos diferentes de 'modo' para manejar los límites con la función de convolución de scipy. Cada imagen de resultado se muestra como una matriz periódica.](https://miro.medium.com/v2/resize:fit:640/format:webp/1*k5Khq-dT8WsCXySbU3LGvw.png)
Ahora podemos utilizar un enfoque de transformada de Fourier para calcular la convolución: como se muestra en la publicación anterior, solo necesitamos tomar la transformada inversa de Fourier del producto de la transformada de Fourier de ambas señales, la imagen y el núcleo:
![Ecuación base para calcular la convolución de 2 señales utilizando un enfoque de transformada de Fourier.](https://miro.medium.com/v2/resize:fit:640/format:webp/1*2wfj0oSKBRh2lRZmI23CjA.png)
![Resultado de la convolución utilizando un enfoque de transformada de Fourier, no scipy.](https://miro.medium.com/v2/resize:fit:640/format:webp/1*J5QJNnIWRoh9J7T655c32Q.png)
Comparando el resultado con el modo “wrap” de scipy, podemos ver que los resultados se parecen mucho, solo con un ligero desplazamiento:
![Comparación entre la convolución de scipy con modo='wrap' y el enfoque de transformada de Fourier. Son casi idénticos. Utilizando la representación de matriz periódica, podemos ver que es solo una cuestión de desplazamiento.](https://miro.medium.com/v2/resize:fit:640/format:webp/1*7xZ2XqN7Y0tSTip3Dc9ezA.png)
Esto es solo una cuestión de indexación, y podemos obtener los mismos resultados utilizando un núcleo centrado desplazado:
![Comparación entre la convolución con modo='wrap' de scipy (izquierda) y 2 enfoques de transformada de Fourier: con el núcleo acolchado en los lados (centro) y núcleo centrado (derecha). La imagen de la izquierda y la de la derecha son idénticas.](https://miro.medium.com/v2/resize:fit:640/format:webp/1*Yk0lhHANLJ7JbT5T067fKA.png)
Utilizando un centrado adecuado, obtuvimos resultados idénticos entre la convolución de scipy con modo=’wrap’ y el enfoque de transformada de Fourier.
Por curiosidad, veamos qué enfoque es más rápido:
![Comparación de tiempo entre scipy y transformada de Fourier para calcular la convolución entre nuestras 2 imágenes: la transformada de Fourier es aproximadamente 15 veces más rápida que scipy.](https://miro.medium.com/v2/resize:fit:640/format:webp/1*psCpFn0H38FX6lCRqq6E5Q.png)
Nuevamente, el enfoque de transformada de Fourier fue más rápido, y en este caso más rápido que una función de scipy, lo cual es bueno.
Conclusiones
Hemos visto en esta publicación cómo la convolución circular se traduce en imágenes y cómo es equivalente a la función de convolución de scipy utilizando el modo=’wrap’.
En la próxima publicación, profundizaremos en el uso de funciones de ventana en el contexto de la transformada de Fourier para reducir la fuga espectral y mejorar el análisis espectral.
¡Suscríbete para recibir futuras publicaciones sobre la transformada de Fourier directamente en tu feed!
También, echa un vistazo a mis otras publicaciones y si te gusta alguna de ellas, por favor suscríbete, me ayuda mucho a alcanzar mi objetivo de 100 suscriptores:
Transformada de Fourier para series de tiempo: convolución rápida explicada con numpy
Convolución 10000 veces más rápida usando la transformada de Fourier
towardsdatascience.com
PCA/LDA/ICA: una comparación de algoritmos de análisis de componentes
Revisar los conceptos y diferencias entre estos famosos algoritmos.
towardsdatascience.com
PCA-whitening vs ZCA-whitening: una visualización en numpy de 2D
El proceso de blanqueamiento de datos consiste en una transformación tal que los datos transformados tienen una matriz de identidad como …
towardsdatascience.com
Resolución 300 veces más rápida del Método de Diferencias Finitas usando numpy
El método de diferencias finitas es una técnica poderosa para resolver problemas complejos, ¡y numpy lo hace rápido!
towardsdatascience.com
Representación interactiva del circuito RC bien conocido en Jupyter
Otro paso en ipywidgets y matplotlib
towardsdatascience.com
Envoltura de las matrices de numpy
El enfoque del contenedor.
towardsdatascience.com
Si esos artículos te parecen interesantes, recuerda seguirme, los nuevos artículos aparecerán en tu feed.
We will continue to update Zepes; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles
- Analizar la infestación de roedores utilizando las capacidades geoespaciales de Amazon SageMaker
- ¿Cómo conseguir un empleo en Ciencia de Datos? [Decodificado en 8 sencillos pasos]
- Emily Webber de AWS sobre Preentrenamiento de Modelos de Lenguaje Grandes
- Pensando como un anotador en profundidad Generación de instrucciones para etiquetar conjuntos de datos
- Lanzando un gato entre las palomas? Aumentando la computación humana con modelos de lenguaje grandes
- Configuración de Proyectos en Python Parte VI
- Ojos en el premio Manteniendo el valor empresarial en el núcleo de los programas de datos