abril 20, 2021 10:00 am

Jesús

Puede que no lo parezca, pero las imágenes son señales, como las que salen de tu radio u horno microondas.

Por consiguiente, como toda señal, es susceptible a verse afectada por el ruido, lo que deteriora la calidad de la información transmitida. 

Si alguna vez has visto estática en tu televisor, entonces sabes a la perfección cómo luce el ruido visual.

En el artículo de hoy aprenderemos un par de técnicas para minimizar el impacto de diferentes tipos de ruido en nuestras imágenes.

Al final de este artículo habrás aprendido:

  • Qué es el ruido en una imagen.
  • Cómo se combate el ruido de una imagen.
  • Cómo añadir diferentes tipos de ruido a una imagen usando scipy y NumPy.
  • Cómo reducir el ruido en una imagen usando scipy.

¡Empecemos! ?

¿Qué es el Ruido en una Imagen?

Cuando hablamos de ruido en computer vision, nos referimos a píxeles cuya información ha sido corrompida o destruida, lo que, como en el caso de cualquier señal, distorsiona y daña la calidad de la misma y, en consecuencia, dificulta y en ocasiones imposibilita entender el contenido de una imagen digital.

El ejemplo perfecto de ruido en una imagen es la estática, donde simplemente el 100% de la información ha sido reemplazada con ruido aleatorio.

estática

La estática es una imagen que es solo ruido.

¿Cómo se Reduce el Ruido en una Imagen?

Para reducir el ruido en una imagen, lo que buscamos es reconstruir la información perdida. Para ello contamos con varias opciones:

  • Usamos la información de los píxeles vecinos para determinar el valor probable del píxel corrupto.
  • Aprendemos, mediante machine learning o deep learning, la distribución de los píxeles en una imagen, y a partir de dicho aprendizaje tratamos de reconstruir la imagen.

En este tutorial nos centraremos en el primer método. En particular, nos enfocaremos en dos tipos de filtros:

  1. 1
    Filtro uniforme, el cual calcula el valor del píxel corrupto con base al promedio de los píxeles que lo rodean (es decir, los vecinos).
  2. 2
    Filtro de mediana, el cual funciona igual que el anterior, sólo que calcula la mediana en vez del promedio.

Creación del Entorno de Desarrollo con virtualenv

Nuestro proyecto se compone de un único script, datasmarts/denoise.py, donde simularemos varios tipos de ruido sobre una imagen de entrada, para después aplicar las técnicas de restauración arriba mencionadas:

datasmarts
└── denoise.py

Para crear y activar nuestro entorno virtual, ejecutamos los siguientes comandos:

Luego, hemos de instalar estas dependencias:

Para ello, tenemos que ejecutar este comando en la terminal:

pip install -r requirements.txt

¡Listo! Empecemos a echar código en la siguiente sección.

Reducción de Ruido en Imágenes con skimage y scipy

Abre el archivo datasmarts/denoise.py e insertas estas líneas:

Luego, definiremos la función auxiliar plot_images(), mediante la cual exploraremos visualmente los efectos de los filtros de reducción de ruido sobre diferentes tipos de distorsiones provenientes de variadas distribuciones estadísticas:

Si te fijas en el extracto anterior, verás que para cada método de reducción de ruido estamos calculando una métrica conocida como PSNR, que en español significa Proporción Máxima de Señal a Ruido, que como su nombre indica, nos indica la relación entre la máxima energía posible de una señal y el ruido que afecta su representación. 

Mientras más alto sea el valor del PSNR, menor afectación del ruido tendremos.

En el siguiente extracto definimos el menú del programa, compuesto por un único parámetro, -i/--input, la ruta a la imagen de entrada:

Después, leemos la imagen y la convertimos a escala de grises antes de procesarla:

En nuestro primer experimento, añadiremos ruido Gaussiano a la imagen, y luego dibujaremos el resultado de aplicarle un filtro de mediana y uno uniforme, y compararemos las versiones restauradas con la imagen original:

El segundo experimento es similar al anterior, solo que esta vez aplicaremos un poco de ruido sal y pimienta:

Repetimos el proceso, pero en esta ocasión agregando ruido proveniente de una distribución de Poisson:

Ahora agregaremos ruido o interferencia moteada:

En los últimos tres experimentos generaremos y añadiremos ruido de las siguientes distribuciones: Rayleigh, exponencial y uniforme:

Para correr el programa, ejecutamos este comando:

python datasmarts/denoise.py -i woman.png

En primer lugar tenemos esto:

gaussian

Reducción de ruido Gaussiano.

El primer recuadro muestra la imagen de entrada con ruido gaussiano aplicado. En el segundo recuadro tenemos el resultado de aplicar un filtro uniforme, el cual llena los píxeles dañados o afectados por el ruido con el promedio de los píxeles vecinos (en nuestro caso, en un vecindario de radio 5).

En el tercer recuadro vemos la imagen restaurada con un filtro de mediana, que repara los píxeles dañados con el valor de la mediana de los vecinos del mismo.

En el recuadro de la derecha vemos la imagen original. Queda patente que, aunque no pudimos devolver la imagen dañada a su estado original, sí obtuvimos una versión mejorada, aunque de baja resolución.

Finalmente, observamos que el filtro uniforme es un poco mejor que el de mediana, ya que el primero tiene un PSNR de 24.262 versus 24.16 del segundo.

A continuación tenemos el resultado de los otros experimentos. ¿Te animas a interpretarlos?

Reducción de ruido sal y pimienta.

Reducción de ruido Poisson.

Reducción de interferencia de moteo.

Reducción de ruido Rayleigh.

Reducción de ruido exponencial.

Reducción de ruido uniforme.

Resumen

Hoy aprendimos sobre cómo las imágenes son, en realidad, señales y, como tales, pueden verse severamente afectadas por el ruido.

También descubrimos varias formas para reducir el impacto del ruido en nuestras imágenes, tales como métodos estadísticos como los filtros uniformes y de mediana, y otros basados en inteligencia artificial, como los autoencoders, entre otros tipos de redes neuronales avanzadas.

Finalmente, llevamos a cabo varios experimentos con diversos tipos de ruidos, extraídos de distribuciones de probabilidad comunes, como la normal, uniforme, exponencial, Poisson y Rayleigh.

¿Qué te pareció el post de hoy? ¿Qué conclusiones sacas de los resultados observados? ¿Crees que las técnicas de reducción de ruido estudiadas funcionan en todos los casos? La mejor manera de responder estas interrogantes es experimentando por tu cuenta, así que no dudes en descargar el código a continuación:

¡Adiós!

Sobre el Autor

Jesús Martínez es el creador de DataSmarts, un lugar para los apasionados por computer vision y machine learning. Cuando no se encuentra bloggeando, jugando con algún algoritmo o trabajando en un proyecto (muy) cool, disfruta escuchar a The Beatles, leer o viajar por carretera.