diciembre 8, 2021 10:00 am

Jesús

En el artículo de hoy enfocaremos nuestra atención en uno de los pilares de la visión computacional: procesamiento de imágenes.

Estrictamente hablando, cualquier alteración, por mínima que sea, que hagamos a una imagen cuenta como procesamiento

No obstante, en nuestra carrera como expertos en computer vision, tendremos que llevar a cabo operaciones más complejas para verdaderamente extraer valor de la rica data que yace en las imágenes digitales que tendremos a nuestra disposición.

Transformaciones como traslación, rotación o re-escalado de imágenes, en muchas ocasiones, nos facilitan un problema que, de otra manera, sería imposible o, al menos, muy costoso en tiempo y recursos de resolver.
Imagen

La inmensa mayoría de las imágenes digitales que vemos han pasado por uno o más transformaciones para conseguir su estado final.

Tomemos el caso de las redes neuronales convolucionales: Éstas demandan que todas las imágenes de entrada sean de las mismas dimensiones para poder trabajar. Esto requiere de un procesamiento previo.

Así mismo, a veces necesitamos eliminar porciones de la fotografía que no proveen demasiada información dado el contexto del problema que procuramos resolver. 

Por ejemplo, si queremos construir un reconocedor de perros, idealmente quisiéramos contar con imágenes donde la mayor parte de la misma esté ocupada por un can. 

Lamentablemente, las fotos que nos encontramos en el mundo real suelen distar de nuestro ideal. Gracias a operaciones como re-escalado o recortado aleatorio podemos sortear este obstáculo.

Concretamente, en este artículo hablaremos de cómo ejecutar traslaciones o desplazamientos en OpenCV.

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

  • En qué consiste el desplazamiento de imágenes.
  • Cómo utilizar OpenCV para desplazar imágenes.

Traslaciones

La traslación de imágenes nos permite desplazar fotos digitales bidimensionalmente.

La traslación de imágenes nos permite desplazar fotos digitales bidimensionalmente.

Trasladar una imagen consiste en moverla una determinada cantidad de píxeles en el eje X e Y.

Dependiendo de la distancia que queramos trasladar una imagen, ésta puede terminar arriba, abajo, a la izquierda, a la derecha o diagonal con respecto a su posición original.

Por supuesto, este concepto quedará más claro con un script, así que pongámonos manos a la obra.

Creación del Entorno de Desarrollo con Anaconda

Como siempre, empecemos viendo la estructura del proyecto:

.
├── datasmarts
│   └── translate.py
├── env.yml
└── pool.jpg

Vemos que se compone de un único script, datasmarts/translate.py, que encapsula la lógica para trasladar imágenes en OpenCV.

Para crear el ambiente de Anaconda, corre este comando:

conda env create -f opencv-translate

Esta instrucción habrá creado un ambiente llamado opencv-translate, configurado de la siguiente manera:

Puedes activar el ambiente así:

conda activate opencv-translate

Excelente. Prosigamos.

Traslado de Imágenes con OpenCV

Abre el archivo datasmarts/translate.py, e importa los paquetes necesarios para el funcionamiento del programa:

Como veremos en breve, desplazar una imagen en OpenCV es un proceso compuesto de dos pasos:

  1. 1
    Creamos la matriz de traslación.
  2. 2
    Ejecutamos la transformación mediante la función cv2.warpAffine().

Para encapsular este procedimiento en un solo paso, definimos la función auxiliar translate():

Posteriormente, cargamos y mostramos una imagen de prueba que iremos transformando a lo largo del programa:

Las cosas se tornan interesantes en el próximo extracto, donde definimos la matriz de traslación, M

OpenCV tiene este tipo de particularidades a las que debemos estar atentos y, sobre todo, entender profundamente para poder sacarle el máximo provecho y evitar frustraciones futuras.

La función cv2.warpAffine() es la encargada de llevar a cabo la traslación, y esta espera una matriz de floats (esto es importante), con el siguiente formato:
  • La primera fila es de la forma [1, 0, Tx], donde Tx es el número de píxeles que moveremos la imagen en el eje X.
  • La segunda fila debe tener formato: [0, 1, Ty], siendo Ty el número de píxeles a desplazar la imagen en el eje Y.

Sabiendo cómo funciona cv2.warpAffine() y cuál es la semántica de la matriz M, podemos ver que construimos una matriz que trasladará la imagen 25 pixeles en la dirección de X, y 50 píxeles en la de Y (es decir, abajo y a la derecha):

Luego, creamos una matriz que mueve la imagen -50 píxeles en el eje X, y -90 píxeles en el eje Y (arriba y a la izquierda); subsiguientemente llevamos a cabo la traslación con cv2.warpAffine():

A continuación, usamos la función auxiliar translate(), la cual implementamos anteriormente, para desplazar la imagen 100 píxeles hacia abajo:

Por último, mostraremos todas las transformaciones hasta que el usuario presione cualquier tecla:

Podemos ejecutar el programa como sigue (desde la raíz del proyecto):

python datasmarts/translate.py

Veremos la siguiente secuencia de imágenes:

Resumen

El día de hoy aprendimos a realizar traslaciones o desplazamientos en OpenCV.

Descubrimos que para poder efectuar esta operación, tenemos que construir una matriz con un formato especial, y luego pasarla a la función cv2.warpAffine() para poder obtener el resultado esperado.

Aunque en principio puede parecer un poco raro construir una matriz especial para llevar a cabo esta operación, con el tiempo, la práctica y el uso constante, nos acostumbramos a los rasgos peculiares de OpenCV. 

¿Qué te pareció el post de hoy? Si deseas experimentar más por cuenta propia, puedes descargar el código en el siguiente formulario:

¡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.

Paso 2/2: Celebra tu NUEVO EMPLEO en Machine Learning ?

A %d blogueros les gusta esto: