noviembre 17, 2021 10:00 am

Jesús

La unidad fundamental y atómica de una imagen digital es el píxel.

Un píxel es un arreglo de información que cuantifica la intensidad lumínica o brillo en un determinado punto de la imagen.

Aprender a leer y manipular el valor de los píxeles es una habilidad crucial en computer vision, por lo que en el artículo de hoy nos dedicaremos a entender cómo trabajar con píxeles en OpenCV.

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

  • Cómo acceder al valor de un píxel específico en OpenCV.
  • Cómo modificar el valor de un píxel específico en OpenCV.
  • Cómo acceder a una región de una imagen en OpenCV.
  • Cómo modificar los valores de una región de una imagen en OpenCV.

¿Preparado? Empecemos.

Imágenes = Matrices

Las imágenes son matrices

Las imágenes son matrices

Los seres humanos interpretamos las imágenes mediante diversos patrones de luz y color. Sin embargo, en un computador éstas se representan de una manera muy distinta, la cual busca proveer un resultado lo más fidedigno posible.

Una imagen digital no es más que una matriz de números, donde cada uno de ellos se denomina píxel. Dependiendo del espacio de color usado, el significado de estos valores varía.

Dos espacios de color comunes son escala de grises y RGB.

En una imagen en escala de grises cada píxel cuantifica la presencia o ausencia de color en ese punto, mediante un valor entre 0 y 255, donde 0 es el negro absoluto y 255 el blanco absoluto. Cualquier otro valor es una variación del gris.

Por otro lado, una fotografía en espacio RGB está compuesta de tres matrices, una por canal de color: Rojo (Red), Verde (Green) y Azul (Azul). Como en el caso de las imágenes en escala de grises, 0 representa la ausencia absoluta de color y 255 la presencia total de la tonalidad correspondiente a un canal en particular. Así, por ejemplo, un píxel con valor (255, 0, 0) se mostrará de color rojo. 

Dimensiones

Típicamente, cuando hablamos del tamaño de una imagen solemos especificar el ancho primero que el alto. Así, si decimos que una fotografía es de 1024 x 680 píxeles, 1280 sería la anchura y 680 la altura.

No obstante, cuando hablamos de matrices, primero especificamos las filas y luego las columnas (por ejemplo, una matriz de 3x2 tiene 3 filas y 2 columnas).

Como en un computador las imágenes son matrices, seguimos la segunda convención en vez de la primera: La primera dimensión corresponde al número de filas (alto), mientras que la segunda a la cantidad de columnas (ancho).

Creación del Entorno de Desarrollo con Anaconda

Como siempre, empecemos viendo la estructura del proyecto:

.
├── datasmarts
│   └── pixels.py
├── env.yml
└── tents.jpeg

Vemos que se compone de un único script, datasmarts/pixels.py, que encapsula la demostración de la manipulación de píxeles en OpenCV..

Para crear el ambiente de Anaconda, corre este comando:

conda env create -f opencv-pixels

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

Puedes activar el ambiente así:

conda activate opencv-pixels

Excelente. Pasemos a la siguiente sección.

Manipulación de Imágenes en OpenCV 

Abre el archivo datasmarts/pixels.py e importa las librerías necesarias para el script:

Definimos la ruta de la imagen que deseamos cargar:

Ahora usamos la función cv2.imread() de OpenCV para cargar la imagen ubicada en la ruta definida arriba, para luego desplegarla en pantalla usando cv2.imshow():

En el extracto de abajo estamos accediendo al píxel ubicado en la posición (200, 300) de la imagen.

Como se trata de una fotografía en espacio RGB, obtendremos tres valores. Sin embargo, te preguntarás por qué nuestras variables son b,g y r en vez de r, g y b. La respuesta es que OpenCV, por defecto, representa las imágenes en BGR, en vez de RGB. Es decir, los canales se hallan en orden inverso al tradicional, pero la misma lógica aplica:

A continuación, sobreescribimos el píxel en la posición (200, 300). ¿Sabes qué color le estamos asignando? 

También nos cerciorarnos de que el cambio fue efectuado al imprimir el resultado de la operación en la consola:

También podemos alterar porciones enteras de una imagen. Eso, precisamente, es lo que hacemos abajo.

 En particular, estamos asignando un mismo color a la esquina superior izquierda de la foto (¿Cuál?):

Por último, mostramos la imagen actualizada:

Podemos correr el script como sigue:

python datasmarts/pixels.py

En la consola verás las siguientes líneas describiendo los valores del píxel (200, 300) antes y después de ser modificado:

Valor del píxel (200, 300) - Rojo: 244, Verde: 221, Azul: 187
Valor (modificado) del píxel (200, 300) - Rojo: 255, Verde: 0, Azul: 0

En pantalla veremos imágenes correspondientes a cada estado intermedio resultante de la manipulación de uno o varios píxeles:

Resumen

El día de hoy aprendimos a manipular directamente los píxeles de una imagen. 

Aunque no es algo que haremos comúnmente, ya que contamos con operaciones más complejas para casos de uso específicos (por ejemplo, difuminado, rotaciones, detección de bordes, entre otros), siempre es importante saber cómo trabajar una imagen a nivel atómico.

Puedes experimentar más por tu cuenta, si gutas. Para ello, descarga el código en este 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: