abril 23, 2021 10:00 am

Jesús

Hace unos días, descubrimos una de las aplicaciones prácticas más interesantes de computer vision al aplicar técnicas de difuminado y detección de bordes para la creación de versiones caricaturizadas de nuestras imágenes favoritas.

El día de hoy continuaremos por una senda similar, sólo que esta vez produciremos versiones a carboncillo (o al menos eso es lo que parecen) con herramientas análogas a las exploradas anteriormente.

¡Sigue leyendo! ¡No te querrás perder este artículo!

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

¡Comencemos!

¡ATENTO!

El enfoque de este artículo es meramente práctico, por lo que nos enfocaremos en los pormenores de las técnicas mencionadas arriba, sino en cómo su aplicación nos ayudará a dar con el resultado deseado.


Si te gustaría que dedicara un artículo a estos métodos, házmelo saber en los comentarios.

Creación del Entorno Virtual con virtualenv

En primer lugar, veamos la estructura del proyecto:

datasmarts
└── sketch.py

Como viene siendo habitual, contamos con un único archivo relevante, datasmarts/sketch.py, donde la implementación de nuestro programa habita.

Ahora, el siguiente paso es crear el entorno de desarrollo con estos comandos:

Nuestro proyecto depende de una serie de librerías externas, listadas a continuación:

Finalmente, para instalarlas, basta con ejecutar este comando:

pip install -r requirements.txt

Continuemos.

Creación de Bocetos con scikit-image

Abre el archivo datasmarts/sketch.py e inserta estas líneas, las cuales importan las dependencias relevantes:

Definiremos una serie de funciones auxiliares que nos ayudarán a separar y organizar mejor nuestro código, siendo la primera normalize(), usada para normalizar los píxeles de una imagen en el rango [0, 1]:

La siguiente es sketch(), la cual toma como argumentos una imagen y una representación gráfica de sus bordes, y los usa para producir un boceto:

Nuestra siguiente función aplica Difusión Anisotrópica a una imagen, y retorna una versión binaria del resultado:

En el siguiente extracto definimos dos funciones que calculan variaciones del mismo algoritmo: Diferencia de Gaussianas. La primera, edges_with_dog() calcula los bordes de una imagen utilizando la versión estándar, mientras que sketch_with_xdog() hace lo propio con la versión extendida:

La última función de soporte, plot_sketches(), toma una imagen de entrada, calcula los tres bocetos correspondientes a las tres técnicas mencionadas anteriormente, y muestra los resultados en una grilla 2x2:

Una vez terminada la creación de funciones auxiliares, lo siguiente es construir el menú del script, compuesto por un único parámetro, -i/--image, la ruta a la imagen de entrada:

Como los bocetos son en blanco y negro, tiene sentido que convirtamos la imagen a escala de grises:

Por último, calculamos y dibujamos los bocetos:

Démosle vida al programa con este comando:

python datasmarts/sketch.py -i woman.jpeg

Después de unos segundos veremos este resultado:

La primera imagen arriba a la izquierda es la original, mientras que las otras tres corresponden a las versiones calculadas con Difusión Anisotrópica, Diferencia de Gaussianas y Diferencia de Gaussianas Extendida. 

Queda patente que en todos los casos las imágenes son estéticamente placenteras, aunque vastamente diferentes entre sí. 

En el caso de la Difusión Anisotrópica nos topamos con centenares de bordes, sombras, ángulos y, en general, mucho nivel de detalle. 

En contraste, la Diferencia de Gaussianas tradicional revela texturas, superficies más suaves, con menos detalles. Finalmente, la Diferencia de Gaussianas Extendida produce un boceto minimalista, con énfasis en las sombras y la forma general de los elementos en la foto, restando o sustrayendo detalles innecesarios.

Corramos otro ejemplo:

python datasmarts/sketch.py -i woman.jpeg

El análisis de la primera imagen aplica perfectamente a la segunda, ¿no crees?

Resumen

El día de hoy aprendimos a utilizar diversas técnicas de difuminado y cálculo de bordes para producir bocetos a partir de nuestras imágenes preferidas.

En particular, estudiamos las siguientes tres técnicas:

Con cada una de ellas obtuvimos resultados interesantes, muy satisfactorios a nivel visual, aunque suficientemente diferenciados entre sí, destacando especialmente la Difusión Anisotrópica por su énfasis en los múltiples detalles que componen una imagen, como las sombras, transiciones entre figuras, bordes y texturas.

Al otro lado del espectro se halla la Diferencia de Gaussianas Extendida, cuya estrategia consiste en utilizar el menor número de elementos posible para transmitir o conservar la esencia de lo que la imagen representa.

¿Te animas a experimentar con tus propias fotos? De ser así, descarga el código a continuación:

¡Hasta pronto!

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.