• Hay filtros de procesamiento de imágenes que solo funcionan en escala de grises.
Para extraer los diferentes colores de la imagen, deberá utilizar la función:
split(imagen)
Esta función devuelve tres imágenes, una por cada uno de los colores primarios que la componen. Dichas imágenes se muestran en blanco y negro. Cuanto más claro sea un píxel, mayor será la intensidad del color primario correspondiente. Para comprobarlo, observe las siguientes figuras geométricas, cada una de las cuales se ha pintado en uno de los colores primarios.
Ahora escriba y ejecute el siguiente programa:
En este código, primero se importa la librería OpenCV y luego se carga la imagen anterior en color. A continuación, se ejecuta la función split(), que devuelve como resultado tres imágenes, una por cada color primario (img_azul, img_verde y img_roja). Finamente, dichas imágenes se muestran en ventanas independientes llamando tres veces a la función imshow().
Por lo tanto, el resultado de la ejecución del programa anterior serán tres ventanas, en cada una de la cuales se mostrará un solo color (que se verá blanco en su máxima intensidad y negro en su ausencia). Puesto que cada figura geométrica es de un color primario, en cada ventana se mostrará en blanco solo una de ellas (la que tiene el color por el que se filtra), y desaparecen el resto, que se funden con el negro del fondo. En visión artificial, este tipo de filtros de color son de gran utilidad, ya que sirven para seleccionar objetos en la imagen sobre los que interesa poner atención y descartar el resto.
Para volver a juntar los componentes de cada color en la misma imagen, utilice la función:
merge(imagen azul, imagen verde, imagen roja)
Dicha función devolvería la imagen en color original.
3.2 OBTENCIÓN DE LAS CARACTERÍSTICAS DE UNA IMAGEN
Las imágenes se almacenan como matrices de píxeles en objetos de la clase ndarray, de los que se pueden extraer características clave como sus dimensiones, el número de canales que las componen, el tipo de dato con el que se almacena la información o el tamaño que ocupa en disco.
Para conocer las dimensiones y el número de canales de una imagen, acceda a su atributo:
shape
El valor de dicho atributo es una tupla con tres valores:
(alto, ancho, n.° canales)
El tamaño que ocupa en disco una imagen vendrá dado por su ancho y alto, así como por el número de canales que contiene. Una imagen en blanco y negro tiene un canal, mientras que las de color se componen de tres (uno por cada color primario). Si cada color se almacenara en un byte, el tamaño en bytes de una imagen sería:
tamaño imagen = ancho x alto x n.° canales
Como se ha indicado, este cálculo es válido cuando los elementos de la matriz de la imagen ocupen un byte, por ejemplo, del tipo uint8. No todos los tipos de datos ocupan lo mismo en disco. Si quiere conocer cuál es el utilizado en una imagen, consulte el atributo:
dtype
Sin embargo, la forma más sencilla de conocer el tamaño en disco de una imagen es accediendo a su atributo:
size
Añada las siguientes sentencias al final del programa visto anteriormente (aquel con el que se cargaba y visualizaba la imagen en color de la niña):
Ahora, además de mostrarse la imagen en pantalla, en la shell obtendrá como resultado que tiene un tamaño de 921 600 píxeles, sus dimensiones son de 640 × 480 píxeles y se compone de tres canales, cuyos valores son del tipo uint8.
Compruebe que el tamaño de la imagen es el resultado de multiplicar el ancho por el alto y el número de canales (colores por píxel). En este caso, 640 × 480 × 3 = 921 600.
3.3 CREACIÓN DE UNA IMAGEN A PARTIR DE UNA MATRIZ DE PÍXELES
Como ya sabe, una imagen es un objeto ndarray que contiene una matriz cuyos elementos establecen el nivel de luz (o color) de cada píxel. Si la imagen fuera en blanco y negro, el valor de dichos elementos sería un entero comprendido entre el 0 (oscuridad absoluta) y el 255 (máximo nivel de luz). Para entenderlo mejor, en la siguiente figura se muestra una imagen negra de 5 × 5 píxeles y su representación como una matriz.
En Python, esta matriz de píxeles sería la siguiente:
Para convertir dicha matriz en un objeto de la clase ndarray, que es como realmente se representan las imágenes en OpenCV, tendría que utilizar la función array() de la propia librería NumPy. El código sería el siguiente:
Más abajo puede ver el resultado de la ejecución de este programa, que muestra en la shell la matriz que representa una imagen negra de 5 × 5.
Observe que una matriz NumPy no muestra sus elementos separados por comas.
Sin embargo, esta forma de trabajar no sería práctica cuando se manejan imágenes con una resolución de miles de píxeles. Por eso, la librería NumPy permite crear esta matriz de forma más sencilla, mediante la función:
zeros(dimensiones, tipo)
El primer argumento es una tupla con las dimensiones de la matriz. El segundo es el tipo de los elementos que contiene. Así, el programa anterior podría sustituirse por:
Antes de ejecutar la función que crea la imagen, es necesario importar la librería NumPy, ya que la clase ndarray pertenece a dicha librería, no a OpenCV. La imagen devuelta por la función zeros() es de 5 × 5 píxeles, mientras que la información almacenada en cada píxel son valores enteros sin signo entre 0 y 255 (uint8). El resultado de la ejecución de este programa sería el mismo que el anterior.
Una vez que ya tiene creada la imagen, solo resta visualizarla