Visión artificial. Tomás Domínguez Mínguez

Читать онлайн.
Название Visión artificial
Автор произведения Tomás Domínguez Mínguez
Жанр Математика
Серия
Издательство Математика
Год выпуска 0
isbn 9788426733474



Скачать книгу

la eficiencia de los algoritmos de procesamiento de imágenes, al trabajar con un valor por píxel (en color serían 3). Esto es especialmente crítico cuando se utilizan algoritmos que consumen muchos recursos computacionales (especialmente si se usan ordenadores de bajas prestaciones) o es necesario dar respuesta en tiempo real (como sucede cuando se trabaja con aplicaciones de realidad aumentada).

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

Illustration

      Ahora escriba y ejecute el siguiente programa:

Illustration

      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.

Illustration Illustration

      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.

      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):

Illustration

      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.

Illustration Illustration

      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.

      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.

Illustration

      En Python, esta matriz de píxeles sería la siguiente:

Illustration

      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:

Illustration

      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.

Illustration Illustration

      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:

Illustration

      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