mayo 4, 2021 10:00 am

Jesús

Hoy hablaremos sobre otra técnica para la reducción de ruido en nuestras imágenes, conocida como Difusión Anisotrópica, la cual a diferencia de muchas de las metodologías estudiada hasta los momentos, tiende a conservar los detalles importantes de una imagen digital, como los bordes y líneas.

El fundamento matemático de la Difusión Anisotrópica, también conocida como Difusión de Perona-Malik, es bastante complicado, al menos dado el contexto en el que solemos manejarnos acá, por lo que en este post nos centraremos en su aplicación práctica mediante la librería MedPy.

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

¿Preparado? Bien, comencemos.

Creación del Entorno de Desarrollo con virtualenv

En el esquema inferior vemos que el único archivo de interés es datasmarts/ad_denoise.py:

datasmarts
└── ad_denoise.py

Creemos ahora el entorno de desarrollo con estos comandos:

Nuestro proyecto depende de los paquetes que se listan a continuación:

Ejecuta esta instrucción para instalar las librerías mostradas ut supra:

pip install -r requirements.txt

Eso es todo por este lado. ¡Sigamos!

Reducción de Ruido con Difusión Anisotrópica en MedPy

Abre el archivo datasmarts/ad_denoise.py e importa las dependencias necesarias:

Descargamos y convertimos a un arreglo multidimensional de floats la imagen con la que trabajaremos:

Añadiremos algo de ruido aleatorio a nuestra imágene para poder constatar más adelante la efectividad de la técnica; también acotaremos los valores al rango [0, 1]:

Ahora lo que haremos es ir armando progresivamente el mosaico de salida, compuesto tanto por la imagen original como por la restaurada con la difusión anisotrópica. Empezaremos mostrando la imagen original inalterada:

Después, dibujamos la misma imagen pero con ruido:

Pietro Perona y Jitendra Malik propusieron en su paper de 1990, dos ecuaciones para el coeficiente de difusión de los bordes. Recordemos que la difusión anisotrópica es un mecanismo iterativo. Para una definición formal de las dos funciones mencionadas previamente, dirígete acá.

El siguiente bloque aplica la ecuación 1, durante 20 iteraciones, con K = 20:

En este bloque, aplicamos la ecuación 2, durante 50 iteraciones y con K = 50:

Corre el programa así:

python datasmarts/ad_denoise.py

Al cabo de unos instantes veremos esta imagen, correspondiente al mosaico comparativo que acabamos de crear:

difusion anisotropica

Arriba a la izquierda nos topamos con la imagen original, acompañada a su derecha por la copia con ruido aleatorio añadido. 

En la segunda fila, la imagen de la izquierda muestra el resultado de aplicar la ecuación 1 de la Difusión de Perona-Malik durante 20 iteraciones, con K = 20. Ciertamente el ruido se atenuó, aunque en detrimento de la nitidez de las líneas y demás detalles.

La última imagen del conjunto, ubicada abajo a la derecha, corresponde a aplicar la difusión anisotrópica usando la ecuación 2, durante 50 iteraciones, con K = 50. A pesar de que en este caso también se redujo el ruido, hemos perdido considerablemente nitidez y claridad en la fotografía.

Es evidente que debemos ajustar con sumo cuidado el número de iteraciones y el parámetro kappa para maximizar la reducción de ruido, al tiempo que minimizamos la pérdida de nitidez.

Resumen

Hoy aprendimos a utilizar un nuevo mecanismo para reducir ruido en nuestras imágenes, conocido como Difusión Anisotrópica o, más formalmente, Difusión de Perona-Malik.

La gran ventaja de este algoritmo en comparación a los que hemos estudiado últimamente, es que fue especialmente concebido para conversar lo más posible los elementos definitorios de los objetos representados de una imagen, como lo son las líneas, bordes y demás detalles de importancia.

En lo práctico, descubrimos que es sumamente sencillo llevar a cabo la difusión anisotrópica mediante la función anisotropic_diffusion(), proporcionada por la librería MedPy.

Por último, determinamos que para obtener los mejores resultados posibles, debemos ajustar finamente el número de iteraciones, así como el valor de kappa con base a las características de cada imagen en particular.

¿Te animas a descargar el código y a seguir explorando por tu cuenta? Si es así, aquí lo tienes ??.

¡Nos vemos!

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.