La Template matching (comparación de plantillas) es una técnica para encontrar áreas de una imagen que son similares a un patrón (plantilla). Miremos un ejemplo.
Un patrón es una imagen pequeña con ciertas características. El objetivo de la comparación de plantillas (Template Matching) es encontrar el patrón/plantilla en una imagen.
Para encontrarlo, el usuario tiene que dar dos imágenes de entrada: Imagen de origen (S) – La imagen para encontrar la plantilla y la Imagen de plantilla (T) – La imagen con cierto atributo que se encuentra en la imagen de origen.
1. ¿Qué es Template Matching?
Template Matching es básicamente un método para buscar y encontrar la ubicación de una imagen de plantilla en una imagen más grande.
La idea aquí es encontrar regiones idénticas de una imagen que coincidan con una plantilla que proporcionamos, dando un umbral (threshold)
- El umbral depende de la precisión con la que queremos detectar la plantilla en la imagen de origen.
- Por ejemplo, si aplicamos el reconocimiento facial y queremos detectar los ojos de una persona, podemos proporcionar una imagen aleatoria de un ojo como la plantilla y buscar la fuente (la cara de una persona).
- En este caso, ya que los «ojos» muestran una gran cantidad de variaciones de persona a persona, incluso si fijamos el umbral como 50% (0.5), el ojo será detectado.
- En los casos en que se busquen plantillas casi idénticas, el umbral debe fijarse alto. (T> = 0.8)
Para el ejemplo práctico he tomado una imagen de la bella Kaley Cuoco:
2. ¿Cómo funciona Template Matching?
- La imagen de la plantilla simplemente se desliza sobre la imagen de entrada (como en la convolución 2D)
- Ésta plantilla creada (de la imagen de entrada) y la imagen de plantilla se comparan.
- El resultado obtenido se compara con el umbral.
- Si el resultado es mayor que el umbral, la porción será marcada como detectada.
- En la función cv2.matchTemplate (img_gray, template, cv2.TM_CCOEFF_NORMED) el primer parámetro es la imagen principal, el segundo parámetro es la plantilla a emparejar y el tercer parámetro es el método utilizado para hacer coincidir.
#Programa Python Ejemplo
#Template Matching
import cv2
import numpy as np
#Leer la imagen principal
img_rgb = cv2.imread('face.jpg')
cv2.imshow('Face',img_rgb)
#Convertir a escala gris
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
cv2.imshow('Test',img_rgb)
#Leer la plantilla
template = cv2.imread('eye.jpg',0)
#Almacenar la anchura (w) y la altura (h) de la plantilla
w, h = template.shape[::-1]
#Realizar operaciones de coincidencia
res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)
#Especificar un umbral (threshold)
threshold = 0.5
#Almacenar las coordenadas del área coincidente en un array numpy
loc = np.where( res >= threshold)
#Dibujar un rectángulo alrededor de la región adaptada encontrada
for pt in zip(*loc[::-1]):
cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,255,255), 1)
#Mostrar la imagen final con el área correspondiente
cv2.imshow('eye',template)
cv2.imshow('Detectado',img_rgb)
cv2.waitKey(0)
3. Limitaciones de Template Matching
- Las ocurrencias de patrones tienen que conservar la orientación de la imagen de patrón de referencia (plantilla)
- Como resultado, no funciona para versiones rotadas o escaladas de la plantilla como un cambio en la forma/tamaño, etc.
- El método es ineficiente cuando se calcula la imagen de correlación de patrones para imágenes de tamaño medio a grande, ya que el proceso consume mucho tiempo.
Para evitar el problema causado por los diferentes tamaños de la plantilla y la imagen original podemos utilizar el multiescalado. Entonces, sólo porque las dimensiones de la plantilla no coinciden con las dimensiones de la región en la imagen que desea coincidir, no significa que no se puede aplicar la coincidencia de plantillas.
Entonces usted puede utilizar el paquete imutils para realizar operaciones básicas en el procesamiento de la imagen. En cualquier caso, puedes conseguir mayor información en el enlace de abajo. Si te ha gustado, comparte!
Descargar e Instalar imutils
https://github.com/jrosebr1/imutils