La biblioteca OpenCV Python ha hecho posible automatizar el proceso de fusionar múltiples imágenes en una sola imagen panorámica.

La fotografía panorámica es la técnica de capturar un campo de visión más amplio que una sola fotografía no puede lograr. Esta técnica une varias imágenes para crear una única imagen que captura toda la escena de forma inmersiva.

Con la ayuda de Python, puede automatizar este proceso y crear hermosos panoramas con facilidad.

Configuración de su entorno de Python

Para seguir adelante, debe tener un comprensión básica de Python. Inicie cualquier IDE de Python y crear un nuevo entorno virtual. Cree un nuevo archivo de Python. Y en la terminal, ejecute el siguiente comando para instalar OpenCV.


pip instalar opencv-contrib-python

Usarás el opencv-contrib-python librería para cargar imágenes y manipularlas. tiene el cv2.Grapadora clase que utilizará para crear los panoramas.

El código fuente completo y las imágenes de muestra utilizadas en este artículo están disponibles en este repositorio GitHub.

instagram viewer

Importación de las bibliotecas requeridas

Importar el cv2 y sistema operativo módulos en su script. Utilizará el sistema operativo para navegar por las rutas del sistema.

importar cv2
importar sistema operativo

El módulo del sistema operativo es un módulo integrado de Python. Esta es la razón por la que no necesita instalarlo externamente.

Cargando las Imágenes

Cree una función para cargar las imágenes que desea unir. Primero, cree una lista vacía que almacenará las imágenes iniciales. Luego recorra cada archivo en la ruta de la carpeta verificando si el archivo es una imagen. Si es una imagen, cárguela y agréguela a la lista de imágenes.


definitivamentecargar imágenes(ruta de la carpeta):
# Cargue imágenes desde una carpeta y cambie su tamaño.
imágenes = []
para Nombre del archivo en os.listdir (ruta_carpeta):
# Comprobar si el archivo es un archivo de imagen
si nombre de archivo.termina con('.jpg') o nombre de archivo.termina con('.png'):
# Cargue la imagen usando OpenCV y cambie su tamaño
imagen = cv2.imread (os.path.join (carpeta_ruta, nombre de archivo))
imágenes.append (imagen)
devolver imágenes

Puede agregar más formatos de archivo de imagen para diversificar su programa. Este código solo buscará .jpg y .png formatos de archivo.

Cambiar el tamaño de las imágenes para obtener una puntada uniforme y un procesamiento más rápido

Cree una función que cambie el tamaño de la lista de imágenes. La función recorrerá cada imagen de la lista y cambiará su tamaño. Finalmente, agregue las imágenes redimensionadas a una nueva lista.


definitivamenteredimensionar_imágenes(imágenes, ancho, alto):
imágenes_redimensionadas = []
para imagen en imágenes:
resized_image = cv2.resize (imagen, (ancho, alto))
resize_images.append (resize_image)
devolver imágenes_redimensionadas

Cambiar el tamaño asegura que la costura de las imágenes sea uniforme. También reduce el tamaño del archivo para un procesamiento más rápido.

Uso del módulo Stitcher de OpenCV para unir las imágenes

Cree una función para unir las imágenes redimensionadas. Esta técnica se conoce comúnmente como creación de un panorama. La función tomará una lista de imágenes como entrada. Utilizar el grapadora módulo para unirlos. Finalmente, la función devolverá una imagen cosida y un código de estado.


definitivamentepuntadas_imágenes(imágenes):
grapadora = cv2.Stitcher.create()
(estado, imagen_cosida) = grapadora.puntada (imágenes)
si estado == cv2.STITCHER_OK:
devolver imagen_cosida
demás:
devolverNinguno

Si la unión fue exitosa (como lo indica el cv2.STITCHER_OK código de estado), la función devolverá la imagen unida. De lo contrario, volverá Ninguno.

Recortar la imagen unida

Cree una función que tomará la imagen unida y la devolverá después de recortarla. Primero, convierta la imagen unida a escala de grises. Luego aplique un umbral binario para crear una imagen binaria. Finalmente, encuentre el contorno más grande en la imagen binaria y calcule su rectángulo delimitador.


definitivamentedelimitar imagen(imagen):
gris = cv2.cvtColor (imagen, cv2.COLOR_BGR2GRAY)
umbral = cv2.umbral (gris, 0, 255, cv2.UMBRAL_BINARIO)[1]
contornos = cv2.findContours (thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
x, y, w, h = cv2.boundingRect (contornos[0])
imagen_recortada = imagen[y: y + h, x: x + w]
devolver imagen_recortada

La imagen unida se recorta utilizando el rectángulo delimitador.

Vista previa y almacenamiento de la imagen unida usando OpenCV

Cree una función que muestre la imagen unida en una ventana interactiva y la guarde en el disco.


definitivamentevista previa_y_guardar_imagen(imagen, ruta_carpeta, nombre_carpeta):
# Mostrar la imagen cosida
cv2.ventanaNombrada('Imagen cosida', cv2.VENTANA_NORMAL)
cv2.imshow('Imagen cosida', imagen)
cv2.esperaClave(0)

# Guardar la imagen cosida
nombre_archivo_salida = os.ruta.unirse (ruta_carpeta, nombre_carpeta + '_panorama.jpg')
cv2.imwrite (salida_nombre de archivo, imagen)
imprimir('Imagen unida guardada para la carpeta:', nombre de la carpeta)

La imagen panorámica se guarda en la misma carpeta que contiene las imágenes originales.

Controlando el flujo de su programa

Cree una función que controlará el flujo de su programa. Cargará todas las imágenes de la carpeta especificada. Cambia el tamaño y únelos. Recorte la imagen unida, muestre su vista previa y luego guárdela en el disco. Si hay menos de dos imágenes en la carpeta, la función imprimirá un mensaje de error y regresará sin unir ni guardar.


definitivamentecarpeta_costura(ruta_carpeta, ancho=800, altura=800):
# Une todas las imágenes en una carpeta y guarda el resultado.
# Cargar las imágenes de la carpeta
imágenes = cargar_imágenes (carpeta_ruta)

# Comprobar si hay al menos dos imágenes en la carpeta
si len (imágenes) < 2:
imprimir('No hay suficientes imágenes en la carpeta:', ruta de la carpeta)
devolver

# Cambiar el tamaño de las imágenes
resize_images = resize_images (imágenes, ancho, alto)

# Coser las imágenes
imagen_cosida = imágenes_cosidas (imágenes_redimensionadas)
si imagen_cosida esNinguno:
imprimir('Error al unir la carpeta:', ruta de la carpeta)
devolver

# Recortar la imagen cosida
imagen_recortada = imagen_recortada (imagen_cosida)

# Vista previa y guardar la imagen cosida
nombre_carpeta = os.ruta.nombrebase (ruta_carpeta)
preview_and_save_image (imagen_recortada, ruta_carpeta, nombre_carpeta)

Pase la ruta de la carpeta que contiene las imágenes que desea unir.

stitch_folder('imagenes_de_muestra') 

Las imágenes que utilice deben contener características superpuestas. Estas características pueden ser cualquier cosa, desde puntos de referencia prominentes hasta patrones de textura en la imagen. OpenCV los usa como punto de referencia para alinear las imágenes.

Sin estas características, será difícil para OpenCV alinear las imágenes y crear un panorama perfecto.

Probar su programa

Recoge las imágenes que quieras transformar en una imagen panorámica. Asegúrese de que tengan características superpuestas.

Echa un vistazo a la colina en esta primera imagen.

En esta segunda imagen, la colina es ligeramente visible. Esto crea una entidad superpuesta.

Guarde las imágenes en una carpeta. Pase la ruta de la carpeta al carpeta_costura Función para coser. Y luego ejecuta el programa.

El programa unió las imágenes y creó una imagen panorámica con una vista más amplia de la escena. Tenga en cuenta que para crear la imagen panorámica anterior, se utilizaron nueve imágenes que están presentes en el repositorio de GitHub mencionado anteriormente.

Manipulación de imágenes usando OpenCV

La creación de panoramas demuestra algunas de las muchas técnicas de manipulación de imágenes que ofrece OpenCV. Hay más técnicas que puede usar para manipular imágenes para satisfacer sus necesidades. Trabajar en más proyectos que involucren la manipulación de imágenes lo ayudará a mejorar sus habilidades de visión por computadora en general.