Читать книгу Visión artificial - Tomás Domínguez Mínguez - Страница 10

3.1 CARGA Y VISUALIZACIÓN DE LA IMAGEN ALMACENADA EN UN ARCHIVO

Оглавление

Para mostrar una imagen en pantalla, previamente hay que cargarla con la función de OpenCV:

imread(archivo)

Su único argumento contiene el nombre del archivo donde se encuentra la imagen (o la ruta, en el caso de que no esté en la misma carpeta que el programa). Esta función también admite un segundo argumento opcional para especificar la información que se carga de la imagen. Su valor podrá ser el de cualquiera de estas constantes:

• IMREAD_GRAYSCALE. Carga la imagen en blanco y negro. Su valor es 0.

• IMREAD_COLOR. Carga la imagen en color (se ignora el canal alfa). Su valor es 1.

• IMREAD_UNCHANGED. Carga la imagen incluyendo el canal alfa. Su valor es -1.


Si no se indica este argumento, la función toma por defecto el valor IMREAD_COLOR.


El canal alfa define la opacidad de un píxel, es decir, su grado de transparencia. No todos los formatos de imagen admiten este canal (que se añade a los tres correspondientes a los colores primarios). Así, por ejemplo, mientras JPG no lo permite, PNG sí contiene este tipo de información.


Entre los formatos de imágenes que se soportan destacan BMP, JPEG, PNG y TIFF, entre otros. OpenCV no tiene códec para GIF, por lo que el manejo de imágenes en este formato requiere la librería imageio, que tendrá que haber cargado previamente en su entorno Python. Si quiere saber cómo utilizarla, visite https://pypi.org/project/imageio/.

Esta función devolverá un objeto de la clase ndarray, perteneciente a la librería NumPy. Dicho objeto mantiene una matriz cuyos elementos establecen el nivel de luz o color de los píxeles de la imagen.

Una vez obtenida la imagen, la forma de mostrarla en pantalla es llamando a la función de OpenCV:

imshow(ventana, imagen)

El primer argumento determina el título de la ventana, mientras que el segundo contiene la imagen.


El tamaño de la ventana será el de la imagen. Si la resolución de esta fuera muy alta, solo se vería parte de ella.

En el siguiente programa se utilizan ambas funciones:


Con la primera sentencia se importa la librería OpenCV. A continuación, se carga la imagen “cuadro.jpg” (que está dentro de la carpeta “imagenes”) con la función imread(). Su segundo argumento es 0, lo que significa que la imagen se obtiene en blanco y negro. La última sentencia la muestra en una ventana llamada “Cuadro”.


En la ruta de acceso al fichero de una imagen, el carácter ‘.’ simboliza el directorio en el que se encuentra el programa que se está ejecutando. Para acceder al directorio padre, se utilizaría ‘..’, como en este caso.


En los programas desarrollados para cada una de las prácticas, se supone que las imágenes se encuentran en archivos dentro de la carpeta “imagenes” (sin acento), situada al mismo nivel que las que contengan los programas que vaya desarrollando, siguiendo la estructura:


Ejecute el programa. El resultado obtenido lo puede ver a continuación.



Si observara que la ventana se cierra inmediatamente, añada al final del programa las sentencias:


Aunque se estudiarán en detalle más adelante, le avanzo que su función es la de esperar que se pulse una tecla antes de cerrar la ventana.

Pese a que OpenCV es multiplataforma y todos los programas se han probado en Windows, puede que se produzca este efecto en otros sistemas operativos. En ese caso, acuérdese de incluir dichas sentencias en el resto de programas que no las tengan, especialmente en los utilizados en los primeros capítulos.

Cambiando el segundo argumento de la función imread() por 1, la imagen se recuperaría con la información del color.

img = cv2.imread(‘../imagenes/cuadro.jpg’, 1)


Si la imagen ya estuviera cargada en color, una forma de convertirla posteriormente a blanco y negro sería utilizando la función:

cvtColor(imagen, espacio de color)

El primer argumento es la imagen que va a cambiar de espacio de color, que será el determinado por el segundo argumento. En el caso de tener una imagen BGR (como en este caso) y querer pasarla a blanco y negro, su valor sería COLOR_BGR2GRAY.


Existen multitud de códigos de conversión de espacios de color. A lo largo de este libro tendrá ocasión de utilizar frecuentemente el que cambia de BGR al HSV (tendrá ocasión de conocerlo más adelante) y viceversa, cuyos valores son COLOR_BGR2HSV y COLOR_HSV2BGR, respectivamente. Si quiere conocer todas las posibilidades de transformación de que dispone esta función, consulte https://docs.opencv.org/3.4/d8/d01/group__imgproc__color__conversions.html.

El siguiente código muestra un ejemplo de uso de esta función.


Aunque la imagen se carga en color (img), posteriormente se pasa a blanco y negro (img_byn) con la función cvtColor(), que es como finalmente se muestra.

Este proceso de conversión de una imagen en color a otra en blanco y negro es de gran importancia en visión artificial porque:

• Reduce el tamaño de la imagen, al no tener que mantener la información del color.

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


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.

Visión artificial

Подняться наверх