Python | Detección de campos de documentos mediante Coincidencia de plantillas

La coincidencia de plantillas es una técnica de procesamiento de imágenes que se utiliza para encontrar la ubicación de piezas pequeñas/plantillas de una imagen grande. Esta técnica se usa ampliamente para proyectos de detección de objetos, como la calidad del producto, el seguimiento de vehículos, la robótica, etc. 
En este artículo, aprenderemos cómo usar la coincidencia de plantillas para detectar los campos relacionados en una imagen de documento.
Solución
la tarea anterior se puede lograr mediante la coincidencia de plantillas. Recorte las imágenes de campo y aplique coincidencias de plantilla utilizando imágenes de campo recortadas y la imagen del documento. El algoritmo es simple pero reproducible en versiones complejas para resolver el problema de detección de campo y localización de imágenes de documentos que pertenecen a dominios específicos. 
Enfoque
 

  • Recorte/Recorte imágenes de campo del documento principal y utilícelas como plantillas separadas.
  • Definir/ajustar umbrales para diferentes campos.
  • Aplique la coincidencia de plantillas para cada plantilla de campo recortado usando la función OpenCV cv2.matchTemplate()
  • Dibuje cuadros delimitadores utilizando las coordenadas de los rectángulos obtenidos de la comparación de plantillas.
  • Opcional: aumente las plantillas de campo y ajuste el umbral para mejorar el resultado de diferentes imágenes de documentos.

Imagen de entrada: 
 

Original Image

Imagen de salida: 
 

Detected Fields

A continuación se muestra el código de Python: 
 

Python3

# importing libraries
import numpy as np
import imutils
import cv2
 
field_threshold = { "prev_policy_no" : 0.7,
                    "address"        : 0.6,
                  }
 
# Function to Generate bounding
# boxes around detected fields
def getBoxed(img, img_gray, template, field_name = "policy_no"):
 
    w, h = template.shape[::-1]
 
    # Apply template matching
    res = cv2.matchTemplate(img_gray, template,
                           cv2.TM_CCOEFF_NORMED)
 
    hits = np.where(res >= field_threshold[field_name])
 
    # Draw a rectangle around the matched region.
    for pt in zip(*hits[::-1]):
        cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h),
                                    (0, 255, 255), 2)
 
        y = pt[1] - 10 if pt[1] - 10 > 10 else pt[1] + h + 20
 
        cv2.putText(img, field_name, (pt[0], y),
            cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255), 1)
 
    return img
 
 
# Driver Function
if __name__ == '__main__':
 
    # Read the original document image
    img = cv2.imread('doc.png')
       
    # 3-d to 2-d conversion
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
      
    # Field templates
    template_add = cv2.imread('doc_address.png', 0)
    template_prev = cv2.imread('doc_prev_policy.png', 0)
 
    img = getBoxed(img.copy(), img_gray.copy(),
                       template_add, 'address')
 
    img = getBoxed(img.copy(), img_gray.copy(),
                   template_prev, 'prev_policy_no')
 
    cv2.imshow('Detected', img)

  
Ventajas de usar la coincidencia de plantillas

  • Computacionalmente barato.
  • Fácil de usar y modificable para diferentes casos de uso.
  • Da buenos resultados en caso de escasez de datos del documento.

Desventajas

  • Los resultados no son muy precisos en comparación con las técnicas de segmentación que utilizan el aprendizaje profundo.
  • Carece de resolución de problemas de patrones superpuestos.

Publicación traducida automáticamente

Artículo escrito por Harshit Saini 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 *