?️ CONCATENANDO IMÁGENES | OpenCV con Python

Por Administrador

Bienvenidos a un nuevo tutorial, en esta ocasión estaremos tratando el tema de concatenación de imágenes, para ello vamos a emplear dos funciones que nos provee OpenCV, cv2.vconcat y cv2.hconcat las cuales serán empleadas tanto para imágenes como videos. ¿Empezamos?

CONTENIDO:

¿Cómo concatenar imágenes horizontal y verticalmente con OpenCV?

  • cv2.hconcat
  • cv2.vconcat
  • Concatenando imágenes horizontal y verticalmente
    • Ejemplo 1: Concatenando 4 imágenes sobre 4 imágenes
    • Ejemplo 2: Concatenando una imagen, sobre varias imágenes
    • Ejemplo 3: Concatenación usando un video

¿Cómo concatenar imágenes horizontal y verticalmente con OpenCV?

Para la concatenación de imágenes, OpenCV nos ofrece dos funciones cv2.hconcat y cv2.hconcat que serán tratadas en el presente post. A continuación hablaremos de estas funciones y también veremos un ejemplo de concatenación con cada una de ellas, usando las siguientes imágenes:

Tanto la imagen de la figura 1, como la figura 2, poseen las mismas dimensiones: 200 pixeles de ancho, 320 de alto y 3 canales.

NOTA: Puedes ayudarte de shape para conocer las dimensiones con las que cuenta cada imagen, para que puedas concatenarlas fácilmente. Por ejemplo si tienes una imagen llamada imageny le aplicas shape e imprimes, es decir algo así: print('imagen.shape = ', imagen.shape). Obtendrás como resultado un tuple con el número de filas, columnas y canales de la imagen.

cv2.hconcat

Aplica concatenación horizontal a matrices dadas. Para poder aplicar esta función es necesario que el número de filas (alto de las imágenes) y canales de las imágenes sean los mismos. Veamos el uso de esta función con un ejemplo:

import cv2

imagen1 = cv2.imread('imagen_01.jpeg')
imagen2 = cv2.imread('imagen_02.jpeg')

concat_horizontal = cv2.hconcat([imagen1, imagen2])

cv2.imshow('concat_horizontal', concat_horizontal)
cv2.waitKey(0)
cv2.destroyAllWindows()

Línea 1: Importamos OpenCV.

Línea 3 y 6: Leemos las imágenes de entrada.

Línea 6: He aquí la función cv2.hconcat, en ella hemos especificado imagen1 e imagen2 para que sean concatenadas.

Línea 8 a 10: Visualización de la nueva imagen.

Figura 3: Imagen resultante de la concatenación horizontal.

cv2.vconcat

Aplica concatenación vertical a matrices dadas. Para poder aplicar esta función es necesario que el número de columnas (ancho de las imágenes) y canales de las imágenes sean los mismos. Veamos un ejemplo:

import cv2

imagen1 = cv2.imread('imagen_01.jpeg')
imagen2 = cv2.imread('imagen_02.jpeg')

concat_vertical = cv2.vconcat([imagen1, imagen2])

cv2.imshow('concat_vertical', concat_vertical)
cv2.waitKey(0)
cv2.destroyAllWindows()

Las líneas 1 a 4 y 8 a 10, son similares a la programación anterior por ello pasaremos directamente a la línea 6.

Línea 6: Usamos cv2.vconcat, para concatenar verticalmente la imagen1 e imagen2, veamos los resultados:

Figura 4: Imagen resultante de la concatenación vertical.

Concatenando imágenes horizontal y verticalmente

A continuación veremos 2 ejemplos de concatenación de imágenes. En el primer ejemplo concatenaremos las imágenes de la figura 1 y 2 para que formen 2 filas y 4 columnas. En el segundo ejemplo en cambio usaremos una nueva imagen, y a esta concatenaremos 3 imágenes. ¡Vamos por ello!.

Ejemplo 1: Concatenando 4 imágenes sobre 4 imágenes

Para este ejemplo vamos a realizar la siguiente programación:

import cv2

imagen1 = cv2.imread('imagen_01.jpeg')
imagen2 = cv2.imread('imagen_02.jpeg')

# Concatenando imágenes, 2 filas por 4 columnas
concat_h1 = cv2.hconcat([imagen1, imagen2, imagen1, imagen2])
concat_h2 = cv2.hconcat([imagen2, imagen1, imagen2, imagen1])
concat_v = cv2.vconcat([concat_h1, concat_h2])

cv2.imshow('concat_v', concat_v)
cv2.waitKey(0)
cv2.destroyAllWindows()

NOTA: Me centraré en describir las líneas correspondientes a la concatenación, puesto que las demás líneas las vimos más temprano en este mismo post.

Línea 7: En un principio concatenamos las imágenes en orden imagen1, imagen2, imagen1, imagen2 en forma horizontal, y almacenamos la imagen resultante en concat_h1.

Línea 8: Vamos a realizar el mismo procedimiento que en la línea 7, pero esta vez vamos a cambiar el orden de las imágenes, ahora será: imagen2, imagen1, imagen2, imagen1. Almacenamos la imagen resultante de la concatenación horizontal en concat_h2.

Línea 9: Para culminar con este ejemplo necesitamos concatenar verticalmente las imágenes contenidas en concat_h1 y concat_h2, por ello usamos la función cv2.vconcat. Veamos el resultado:

Figura 5: Imagen resultante del ejemplo 1.

Ejemplo 2: Concatenando una imagen, sobre varias imágenes

Para este ejemplo añadiremos una nueva imagen (figura 6), que será ubicada en la parte superior de la imagen resultante. Mientras que las imágenes correspondientes a las figuras 1 y 2 estarán sobre esta nueva imagen.

Figura 6: Imagen de entrada 6.

La programación será la siguiente:

import cv2
import imutils

imagen1 = cv2.imread('imagen_01.jpeg')
imagen2 = cv2.imread('imagen_02.jpeg')
imagen3 = cv2.imread('ave.jpg')
imagen3 = imutils.resize(imagen3, width=600)

# Concatenando una imagen arriba y 3 abajo
concat_h_3imagenes = cv2.hconcat([imagen1, imagen2, imagen1])
concat_v_1sobre3 = cv2.vconcat([imagen3, concat_h_3imagenes])

cv2.imshow('concat_v_1sobre3', concat_v_1sobre3)
cv2.waitKey(0)
cv2.destroyAllWindows()

Línea 6 y 7: Leemos la nueva imagen correspondiente a la figura 6, luego la redimensionaremos a un ancho de 600 pixeles. Esto es importante, ya que con este ancho podremos concatenar 3 imágenes correspondientes a las figuras 1 y 2 que contienen 200 pixeles de ancho cada una.

Línea 10: En un principio realizamos la concatenación horizontal de imagen1, imagen2, imagen1, la nueva imagen se almacenará en concat_h_3imagenes.

Línea 11: Ahora concatenaremos verticalmente la imagen3, sobre concat_h_3imagenes, para ello empleamos cv2.vconcat, y la imagen resultante se almacenará en: concat_v_1sobre3. Veamos el resultado:

Figura 7: Imagen resultante del ejemplo 2.

Ejemplo 3: Concatenación usando un video

Ahora que ya hemos practicado un poco con la concatenación horizontal y vertical, ¿qué te parece si lo aplicamos en un video?. Vamos a realizar un video streaming, convertiremos los fotogramas a escala de grises y también aplicaremos umbralización simple, de tal forma que al lado derecho del videostreaming aparezcan verticalmente las transformaciones en escala de grises y umbralización simple.

Para este ejemplo crearemos un programa llamado concatenando_en_video.py, veamos:

import cv2
import imutils

cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)

while True:
    ret, frame = cap.read()
    if ret == False: break

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    _, th = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY)

    # Ya que gray y th tienen solo un canal habrá que pasar las imágenes
    # a 3 canales, luego se redimensionarán para realizar concatenar
    # las imágenes
    gray = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR)
    th = cv2.cvtColor(th, cv2.COLOR_GRAY2BGR)
    gray = imutils.resize(gray, height = (gray.shape[0] // 2))
    th = imutils.resize(th, height = (th.shape[0] // 2))

    # Puedes imprimir las dimensiones de frame, gray y th
    #print('frame.shape = ', frame.shape)
    #print('gray.shape = ', gray.shape)
    #print('th.shape = ', th.shape)

    # Concatenando primero verticalmente y luego horizontalmente
    concat_v = cv2.vconcat([gray, th])
    concat_h = cv2.hconcat([frame, concat_v])

    # Colocamos texto en las 3 imágenes
    cv2.putText(concat_h, 'Video streaming', (10, 20), 1, 1.5, 
        (0, 255, 0), 2)
    cv2.putText(concat_h, 'Escala de grises', (650, 20), 1, 1.5, 
        (0, 255, 0), 2)
    cv2.putText(concat_h, 'Binarizada', (650, 260), 1, 1.5, 
        (0, 255, 0), 2)

    # Visualización
    #cv2.imshow('Frame',frame)
    #cv2.imshow('gray',gray)
    #cv2.imshow('th',th)
    cv2.imshow('concat_h',concat_h)

    if cv2.waitKey(1) & 0xFF == ord ('q'):
        break
cap.release()
cv2.destroyAllWindows()

Línea 1 a 2: Importamos opencv e imutils.

Línea 4 a 8: Indicamos que vamos a realizar un video streaming, iniciamos un ciclo while y leemos los fotogramas.

Línea 10 y 11: Transformamos frame a escala de grises, esto se almacenará en gray. A su vez, esta última imagen le aplicaremos umbralización simple, cuyo resultado se almacenará en th (si quieres más información sobre esta puedes visitar este post:Simple Thresholding (Umbralización) OpenCV en Python).

Línea 16 y 17: Antes de aplicar la concatenación necesitamos que todas las imágenes a concatenar tengan el mismo número de canales. Dado que gray y th poseen solo un canal, vamos a pasarlas a 3 canales con ayuda de cv2.cvtColor.

Línea 18 y 19: Ya que acoplaremos horizontalmente a frame con grayth concatenadas, necesitamos que estas últimas dos sumadas tenga el mismo alto a número de filas que frame, por ello estoy redimensionando las imágenes a la mitad de su altura.

Línea 22 a 24: Puedes descomentar estas líneas para imprimir las dimensiones que poseen frame, grayth.

Línea 27: Concatenamos verticalmente a grayth, esta nueva imagen se almacenará en concat_v.

Línea 28: Ahora concatenamos horizontalmente frame y concat_v. El resultado se almacenará en concat_h.

Línea 31 a 36: Visualizaremos texto en concat_h, tanto para el video streaming, como para los fotogramas en escala de grises y los binarizados.

Línea 39 a 47: Visualizamos la imagen resultante en concat_h. Si ‘q’ es presionado se rompe el ciclo y se cierran las ventanas creadas.

Veamos los resultados de esta programación:

Figura 8: Imagen resultante del ejemplo 3.

Hemos llegado al final de este tutorial, ¿te gusto o te pareció útil? espero que tu respuesta sea sí. Nos vemos en un siguiente tutorial.

REFERENCIAS: