febrero 14, 2022 10:00 am

Jesús

En los últimos artículos sobre Tesseract, una de las constantes con las que nos hemos topado es la inhabilidad de la librería de procesar imágenes que no presenten condiciones ideales.

¿Por qué es esto?

Las razones son variadas, pero una de las más comunes y más fáciles de solucionar es la falta de preprocesamiento.

Cuando hablamos de preprocesamiento, nos referimos específicamente a pasos, procedimientos y operaciones que aplicamos a la imagen ANTES de pasársela a Tesseract, con el objeto de mejorar los resultados.

Ajustar el balance de color es preprocessamiento.

Reducir el ruido es preprocesamiento.

Aumentar el contraste es preprocesamiento.

Corregir la orientación del texto es preprocesamiento… Y nuestro tópico de hoy.

Al final de este artículo habrás aprendido:

  • Qué es la detección de orientación y escritura (en inglés, Orientation and Script Detection, OSD).
  • Cómo detectar el script de una imagen usando Tesseract.
  • Cómo detectar la orientación del texto en una imagen usando Tesseract.
  • Cómo corregir la orientación del texto usando OpenCV.

¿Estás listo? Si es así, continúa leyendo.

Una Breve Introducción a la Detección de Orientación y Escritura (OSD)

Antes de hablar sobre cómo detectar estos atributos en una pieza de texto, primero debemos definirlos, ¿cierto?

  • Orientación: Es una estimación, en ángulos, de qué tan rotado está el texto con respecto al eje X u horizontal.
  • Escritura (script): Es el “sistema de escritura” del texto en la imagen.

¡ATENTO!

Estoy seguro de que el concepto de orientación te quedó bastante claro, pero el de escritura probablemente no, y no te culpo, ya que es confuso.


Cuando decirnos “script” como atributo de un texto, nos referimos al sistema visual usado para transmitir información de forma escrita


Por ejemplo, los lenguajes como el Español, Inglés, Alemán, Francés, entre muchos otros, están basados en el “script” Latín.


En cambio, el Hebreo está basado en el ”script” Abjad.

En resumen: Script/escritura = sistema caracteres usados en el texto.

Como veremos en breve, también podemos utilizar Tesseract para llevar a cabo OSD.

Creación del Entorno de Desarrollo con Anaconda

En la imagen de abajo verás la estructura del proyecto, donde el archivo de mayor relevancia es datasmarts/osd.py, en el que se implementa el código de detección y corrección de la orientación del texto:

Puedes descargar el código asociado al post en el formulario que sigue:

Como siempre, lo siguiente es configurar el ambiente de Anaconda, para lo que tendrás que estar en la raíz del proyecto y ejecutar este comando:

conda env create -f pytesseract-osd

El ambiente que acabas de crear responde a esta configuración (pytesseract-osd):

Para activar el ambiente, ejecuta:

conda activate pytesseract-osd

¡Genial! Ahora sí, implementemos.

Corrección de la Orientación del Texto en una Imagen con Tesseract OCR (OSD)

Iniciemos abriendo el archivo datasmarts/osd.py, e insertando las instrucciones necesarias para importar las dependencias:

Después, definimos el menú del programa, que se compone únicamente del parámetro -i/--image, la ruta a la imagen de entrada.

A continuación, cargamos la imagen de entrada, y la desplegamos en pantalla:

Para garantizar compatibilidad con Tesseract, tenemos que pasar de BGR a RGB:

Tesseract lleva a cabo OSD mediante la función pytesseract.image_to_osd(), a la cual le estamos proporcionando:

  1. 1
    La imagen sobre la cual trabajar.
  2. 2
    La constante Output.DICT para indicar que queremos que el resultado sea un dict de Python.

Posteriormente, imprimimos los siguientes tres atributos de la respuesta:

  • orientation: Grados de rotación que tiene el texto.
  • rotate: Grados que deberemos rotar, en sentido horario, para corregir la orientación del texto.
  • script: Tipo de escritura detectada en el texto.

Luego, corregimos la imagen rotándola tantos grados como nos diga el valor rotate de results. Esto lo hacemos a través de la función imutils.rotate_bound():

Pasamos la imagen rotada de RGB a BGR para mostrarla usando OpenCV:

Finalmente, destruimos las ventanas creadas:

¡ATENTO!

Antes de ejecutar el código, asegúrate de hallarte en la raíz del proyecto para que los comandos funcionen correctamente.

El primer ejemplo es simplemente una imagen en perfecto estado. Lo usaremos para ver si la percepción de Tesseract coincide con la nuestra:

python datasmarts/osd.py -i lr0.jpg

La imagen es esta, una porción del clásico Lorem ipsum:

Lorem Ipsum

Fig. 1 "Lorem Ipsum"

Y en la consola veremos el resultado:

Orientación detectada: 0
Una rotación de 0° es necesaria para corregir.
Tipo de escritura detectada: Latin

Genial, Tesseract evidentemente se percató de que la imagen no requiere corrección alguna. 

Veamos otro ejemplo:

python datasmarts/osd.py -i lr90.jpg

Se trata de la misma imagen, esta vez rotada 90° hacia la derecha:

Lorem Ipsum

Fig. 2 "Lorem Ipsum" rotada 90°

En la terminal vemos el diagnóstico del OSD aplicado por Tesseract:

Orientación detectada: 90
Una rotación de 270° es necesaria para corregir.
Tipo de escritura detectada: Latin

Efectivamente, la escritura detectada es Latin, y el grado de inclinación es 90° en sentido horario.

No obstante, ¿por qué la rotación necesaria para corregir es 270°? Pues, porque es el complemento de 90° para sumar 360°, que es equivalente a 0°, la rotación que debe tener el texto para estar horizontal.

Hay una tercera imagen, lr15.jpg, con la que te invito a experimentar, e interpretar, por tu cuenta. Para ello, descarga el código en la siguiente sección.

Resumen

El día de hoy aprendimos sobre un proceso conocido como OSD, que significa Orientation and Script Detección, y traducido sería Detección de Orientación y Escritura.

Para saber qué es lo que estamos detectando, tuvimos que definir ambos términos de la siguiente forma:

  1. 1
    Orientación: Grados de rotación que tiene el texto.
  2. 2
    Escritura: Sistema de símbolos utilizados para representar la información del texto.

Posteriormente implementamos un programa que aprovecha el poder de Tesseract para llevar a cabo OSD sobre una imagen, usando la función pytesseract.image_to_osd().

El resultado de invocar esta función es un diagnóstico que nos indica:

  1. 1
    El ángulo de rotación que presenta el texto.
  2. 2
    Cuántos grados debemos rotarlo para que quede horizontal.
  3. 3
    Cuál es la escritura del texto.

Como mencioné al final de la sección previa, puedes descargar el código en este formulario para continuar experimentando y aprendiendo:

¡Nos vemos pronto!

Sobre el Autor

Jesús Martínez es el creador de DataSmarts, un lugar para los apasionados por computer vision y machine learning. Cuando no se encuentra bloggeando, jugando con algún algoritmo o trabajando en un proyecto (muy) cool, disfruta escuchar a The Beatles, leer o viajar por carretera.