Pespunte panorámico OpenCV

Este artículo describe cómo «unir» imágenes usando OpenCV y python.

Panorama es básicamente una fotografía estirada horizontalmente sin distorsión.  

Juntaremos 3 imágenes en la discusión de hoy para crear nuestro propio panorama. Para lograr esto, las imágenes deben tener algunos puntos clave comunes entre las imágenes. En otras palabras, una pequeña porción de imágenes consecutivas debe superponerse; de ​​lo contrario, las imágenes no se pueden unir. Una vez que tengamos listas las imágenes relevantes, simplemente podemos usar la función stitch() que pertenece a la clase Stitcher en el módulo OpenCV. Toma una serie de imágenes como argumento y las une. La función devuelve la imagen resultante y un valor booleano que es Verdadero si la unión tiene éxito; de lo contrario, devuelve Falso.   

Cambie el tamaño de las imágenes de entrada según sus necesidades. Si las imágenes son demasiado grandes, reducirlas siempre es una mejor opción. 

El algoritmo de unión de OpenCV es similar al artículo de Lowe y Brown sobre la unión automática de imágenes panorámicas mediante funciones invariantes. Pero aquí está el algoritmo de diagrama de flujo de la clase de costura de opencv. 

Explicación:

El algoritmo de costura panorámica se puede dividir en cuatro pasos fundamentales básicos. Estos pasos son los siguientes:

  1. Detección de puntos clave (puntos en la imagen) y extracción de descriptores invariantes locales (función SIFT) de las imágenes de entrada.
  2. Encontrar descriptores coincidentes entre las imágenes de entrada.
  3. Cálculo de la array de homografía mediante el algoritmo RANSAC.
  4. Luego, la array de homografía se aplica a la imagen para envolver y ajustar esas imágenes y fusionarlas en una sola.

Los descriptores son vectores que describen el entorno local alrededor de un punto clave específico.  

Los puntos clave se encuentran calculando la diferencia de desenfoque gaussiano de la imagen en diferentes niveles. Eso significa que la imagen está borrosa con un desenfoque gaussiano en diferentes magnitudes, desde ligeramente borrosa hasta más borrosa y así sucesivamente. Luego, esas imágenes se restan entre sí, lo que da como resultado la diferencia de imágenes con diferentes niveles de desenfoque gaussiano. Las imágenes resultantes se apilan unas sobre otras para buscar puntos extremos que sean localmente distintos, esos son puntos clave. 

Los descriptores se calculan observando la vecindad del punto clave, dividiendo la vecindad local en áreas pequeñas y luego calculando el gradiente en estas áreas pequeñas. Estos gradientes se recopilan en forma de histogramas. Básicamente, la frecuencia con la que se producen esos gradientes y su magnitud se convierten en histogramas para pequeñas regiones locales. Finalmente, la concatenación de todos los valores calculados a partir del histograma dará como resultado el vector descriptor. Esto en su conjunto se conoce como función SIFT, que no es más que una forma de calcular puntos clave y descriptores.

En cuanto a la array de homografía, asigna los puntos correspondientes de una imagen a otra. Esto es esencial en la creación del panorama. Es necesario calcular la homografía de dos imágenes, ya que ayuda a envolver una imagen sobre la otra, lo cual es útil para crear panoramas. El algoritmo RANSAC ayuda a calcular esta array de homografía.

La costura real se realiza mediante la función o el método .stitch() de la clase Stitcher. Implementa los pasos anteriores. Esta función viene con la última versión de OpenCV. La función Stitch() acepta una lista de imágenes como parámetro. Devuelve una tupla (estado, salida), donde el estado es un valor booleano y es verdadero cuando la unión se realiza correctamente, de lo contrario, es falso. La salida es el panorama resultante.  

Implementación:

Python3

import cv2
image_paths=['1.jpg','2.jpg','3.jpg']
# initialized a list of images
imgs = []
 
for i in range(len(image_paths)):
    imgs.append(cv2.imread(image_paths[i]))
    imgs[i]=cv2.resize(imgs[i],(0,0),fx=0.4,fy=0.4)
    # this is optional if your input images isn't too large
    # you don't need to scale down the image
    # in my case the input images are of dimensions 3000x1200
    # and due to this the resultant image won't fit the screen
    # scaling down the images
# showing the original pictures
cv2.imshow('1',imgs[0])
cv2.imshow('2',imgs[1])
cv2.imshow('3',imgs[2])
 
stitchy=cv2.Stitcher.create()
(dummy,output)=stitchy.stitch(imgs)
 
if dummy != cv2.STITCHER_OK:
  # checking if the stitching procedure is successful
  # .stitch() function returns a true value if stitching is
  # done successfully
    print("stitching ain't successful")
else:
    print('Your Panorama is ready!!!')
 
# final output
cv2.imshow('final result',output)
 
cv2.waitKey(0)

Producción:

Publicación traducida automáticamente

Artículo escrito por rajarshiban13 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *