noviembre 3, 2021 10:00 am

Jesús

En computer vision, como es de esperar, pasaremos la mayor parte de nuestro tiempo interactuando con imágenes. 

Por tal razón, resulta fundamental entender cómo leer, mostrar y escribir imágenes en disco usando la librería por excelencia de esta disciplina: OpenCV.

¿Qué crees? El objetivo de este artículo es precisamente ese, estudiar un poco más en detalle cómo interactuar a nivel básico con imágenes usando OpenCV ?.

Al final de este post sabrás:

  • Cómo cargar imágenes en OpenCV usando la función cv2.imread().
  • Cómo mostrar imágenes en pantalla con OpenCV usando la función cv2.imshow().
  • Cómo guardar imágenes en disco con OpenCV usando la función cv2.imwrite().

¡Empecemos!

Creación del Entorno de Desarrollo con Anaconda

Como siempre, empecemos viendo la estructura del proyecto:

.
├── datasmarts
│   └── opencv_io.py
├── env.yml
└── images
    └── pizza.jpeg

Vemos que se compone de un único script, datasmarts/opencv_io.py, que encapsula la demostración de cómo leer, mostrar y escribir imágenes en OpenCV.

En el directorio images tenemos una imagen de prueba que usaremos en breve cuando implementemos y corramos nuestro programa.

Para crear el ambiente de Anaconda, corre este comando:

conda env create -f opencv-io

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

Puedes activar el ambiente así:

conda activate opencv-io

Excelente. Pasemos a la siguiente sección.

Cargando, Mostrando y Guardando Imágenes con OpenCV

El script a continuación, a pesar de ser breve, nos enseña cómo llevar a cabo tres de las operaciones más importantes de cualquier librería de visión computarizada: Cargar, mostrar y guardar imágenes.

Para empezar, abre el archivo datasmarts/opencv_io.py e inserta estas líneas para importar las dependencias del programa:

A continuación, definimos el menú del script, compuesto por una única opción, -i/--image, la ruta a la imagen de entrada:

Acto seguido, procederemos a leer la imagen ubicada en la ruta definida por el parámetro -i/--image usando cv2.imread():

En el 99.99% de los casos usaremos el comportamiento por defecto de cv2.imread() para cargar una imagen en memoria (recordemos que, a pesar de que OpenCV usa el espacio de color RGB por defecto, invierte el orden de los canales, así que efectivamente las imágenes se encontraran en la modalidad de color BGR).

No obstante, vale la pena resaltar algunos detalles de esta importante función:

  • cv2.imread() infiere el tipo de una imagen por su contenido, no por su extensión.
  • cv2.imread() soporta los siguientes formatos o extensiones: *.bmp, *.dib, *.jpeg, *.jpg, *.jpe, *.jp2, *.png, *.webp, *.pbm, *.pgm, *.ppm, *.pxm, *.pxm, *.pnm, *.pfm, *.sr, *.ras, *.tiff, *.tif, *.exr, *.hdr, *.pic, entre otras.
  • cv2.imread() también acepta flags para modificar su comportamiento. Para una lista detallada de las opciones que la función recibe, consulta este link: https://vovkos.github.io/doxyrest-showcase/opencv/sphinxdoc/enum_cv_ImreadModes.html

La belleza de OpenCV para Python es su perfecta integración con NumPy. Esto quiere decir que las imágenes, en el fondo, no son más que simples arreglos multidimensionales de NumPy. 

Por este motivo, podemos inspeccionar las dimensiones de la imagen fácilmente, como se desmuestra en el siguiente extracto:

Para mostrar la imagen en pantalla, tenemos que usar cv2.imshow().  Sin embargo, para tener tiempo de verla, necesitamos llamar a la función cv2.waitKey(0), ya que, en caso contrario, OpenCV la mostrará por una fracción de segundo:

Por último, guardamos la imagen con la función cv2.imwrite(). En este ejemplo la estamos llamando copia.png:

¡ATENTO!

Los formatos (extensiones) soportados por cv2.imwrite() son los mismos que cv2.imread().

Podemos correr nuestro programa fácilmente de la siguiente manera:

python opencv_io.py -i datasmarts/pizza.jpeg

En la consola veremos las dimensiones de la imagen:

Ancho: 640 píxeles Alto: 480 píxeles Canales: 3 canales

Y se abrirá una ventana donde veremos la imagen que acabamos de cargar:

Finalmente, veremos que se guardó una nueva imagen (copia.png) en el mismo directorio desde donde ejecutamos el programa:

.
├── copia.png
├── datasmarts
│   └── opencv_io.py
├── env.yml
└── images
    └── pizza.jpeg

¡Eso es todo por hoy! 

Resumen

Hoy aprendimos que es muy fácil cargar, mostrar y guardar imágenes en OpenCV.

Aunque en la mayoría de las ocasiones el comportamiento por defecto de las funciones cv2.imread(), cv2.imshow() y cv2.imwrite() nos bastará, también contamos con cierto nivel de personalización, especialmente al momento de leer imágenes desde disco.

Por ejemplo, si quisiéramos leer una imagen directamente en escala de grises, le pasaríamos el flag cv2.IMREAD_GRAYSCALE a cv2.imread().

También es menester tener en cuenta que, por defecto, OpenCV usa la modalidad de color BGR, que no es más que RGB pero con los canales en orden inverso.

¿Por qué no te descargas el proyecto y sigues experimentando por tu cuenta? Puedes bajar el código en el siguiente formulario:

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

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

A %d blogueros les gusta esto: