Python | Registro de imagen usando OpenCV

El registro de imágenes es una técnica de procesamiento de imágenes digitales que nos ayuda a alinear diferentes imágenes de una misma escena. Por ejemplo, uno puede hacer clic en la imagen de un libro desde varios ángulos. A continuación se muestran algunos ejemplos que muestran la diversidad de ángulos de cámara.
Ahora, es posible que queramos «alinear» una imagen en particular con el mismo ángulo que una imagen de referencia. En las imágenes de arriba, uno puede considerar que la primera imagen es una foto de portada «ideal», mientras que la segunda y la tercera imágenes no sirven bien para la foto de portada de un libro. El algoritmo de registro de imágenes nos ayuda a alinear la segunda y la tercera imagen en el mismo plano que la primera.

¿Cómo funciona el registro de imágenes?  
La alineación puede verse como una simple transformación de coordenadas. El algoritmo funciona de la siguiente manera:  

  • Convierta ambas imágenes a escala de grises.
  • Haga coincidir las características de la imagen que se va a alinear con la imagen de referencia y almacene las coordenadas de los puntos clave correspondientes. Los puntos clave son simplemente los pocos puntos seleccionados que se utilizan para calcular la transformación (generalmente puntos que se destacan), y los descriptores son histogramas de los gradientes de imagen para caracterizar la apariencia de un punto clave. En esta publicación, usamos la implementación ORB (Oriented FAST and Rotated BRIEF) en la biblioteca OpenCV, que nos brinda tanto los puntos clave como sus descriptores asociados.
  • Relaciona los puntos clave entre las dos imágenes. En esta publicación, usamos BFMatcher, que es un comparador de fuerza bruta. BFMatcher.match() recupera la mejor coincidencia, mientras que BFMatcher.knnMatch() recupera las K mejores coincidencias, donde el usuario especifica K.
  • Elija las mejores coincidencias y elimine las coincidencias ruidosas.
  • Encuentre la transformada de homomorfia.
  • Aplique esta transformación a la imagen original sin alinear para obtener la imagen de salida.

Aplicaciones de registro de imágenes: 
algunas de las aplicaciones útiles de registro de imágenes incluyen: 

  • Unión de varias escenas (que pueden o no tener la misma alineación de cámara) para formar una toma panorámica continua.
  • Alineación de imágenes de cámara de documentos a una alineación estándar para crear documentos escaneados realistas.
  • Alineación de imágenes médicas para una mejor observación y análisis.

A continuación se muestra el código para el registro de la imagen. Hemos alineado la segunda imagen con referencia a la tercera imagen. 

Python

import cv2
import numpy as np
 
# Open the image files.
img1_color = cv2.imread("align.jpg")  # Image to be aligned.
img2_color = cv2.imread("ref.jpg")    # Reference image.
 
# Convert to grayscale.
img1 = cv2.cvtColor(img1_color, cv2.COLOR_BGR2GRAY)
img2 = cv2.cvtColor(img2_color, cv2.COLOR_BGR2GRAY)
height, width = img2.shape
 
# Create ORB detector with 5000 features.
orb_detector = cv2.ORB_create(5000)
 
# Find keypoints and descriptors.
# The first arg is the image, second arg is the mask
#  (which is not required in this case).
kp1, d1 = orb_detector.detectAndCompute(img1, None)
kp2, d2 = orb_detector.detectAndCompute(img2, None)
 
# Match features between the two images.
# We create a Brute Force matcher with
# Hamming distance as measurement mode.
matcher = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck = True)
 
# Match the two sets of descriptors.
matches = matcher.match(d1, d2)
 
# Sort matches on the basis of their Hamming distance.
matches.sort(key = lambda x: x.distance)
 
# Take the top 90 % matches forward.
matches = matches[:int(len(matches)*0.9)]
no_of_matches = len(matches)
 
# Define empty matrices of shape no_of_matches * 2.
p1 = np.zeros((no_of_matches, 2))
p2 = np.zeros((no_of_matches, 2))
 
for i in range(len(matches)):
  p1[i, :] = kp1[matches[i].queryIdx].pt
  p2[i, :] = kp2[matches[i].trainIdx].pt
 
# Find the homography matrix.
homography, mask = cv2.findHomography(p1, p2, cv2.RANSAC)
 
# Use this matrix to transform the
# colored image wrt the reference image.
transformed_img = cv2.warpPerspective(img1_color,
                    homography, (width, height))
 
# Save the output.
cv2.imwrite('output.jpg', transformed_img)

Producción: 

Publicación traducida automáticamente

Artículo escrito por Anannya Uberoi 1 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 *