Reconocimiento Óptico de Caracteres (OCR) con Python y Tesseract 4: Una introducción

Publicado en:
Aprende a utilizar OCR con Python y Tesseract 4. Extrae texto de imágenes, maneja fondos ruidosos y mejora la precisión con esta guía completa.

Introducción

Este tutorial es una introducción al reconocimiento óptico de caracteres (OCR) con Python y Tesseract 4. Tesseract es un paquete excepcional que ha estado en desarrollo durante décadas, remontándose a los esfuerzos realizados por IBM en la década de 1970 y, más recientemente, por Google. Al momento de escribir esto (noviembre de 2018), se acaba de lanzar una nueva versión de Tesseract, la versión 4, que utiliza modelos preentrenados de aprendizaje profundo para reconocer caracteres. Esta versión no solo puede reconocer caracteres escaneados con gran precisión, sino también texto manuscrito, superando significativamente a Tesseract 3 en rendimiento. El reconocimiento óptico de caracteres es especialmente útil para imágenes escaneadas que contienen texto. Los documentos históricos, por ejemplo, suelen estar disponibles en formato escaneado pero aún no han sido digitalizados. También podrías querer escanear documentos tú mismo y extraer su contenido para realizar un análisis.

Instalación de tesseract

Instalación en sistemas Unix

La instalación de Tesseract para sistemas basados en Unix es bastante sencilla, ya que puedes descargar binarios precompilados. Puedes instalarlos en Mac OS X con:

brew install Tesseract --HEAD

El parámetro --HEAD se agrega para asegurar que obtengas la versión más reciente de Tesseract 4, que salió de su fase beta este mes.

Y en Ubuntu se puede instalar de la siguiente manera:

sudo apt install tesseract-ocr
sudo apt install libtesseract-dev

Si estás utilizando otra distribución de Linux, por favor consulta la guía de instalación aquí:

https://github.com/tesseract-ocr/tesseract/wiki.

Instalación en Windows

En Windows, es necesario seguir un procedimiento de instalación.

No puedo proporcionar una traducción o reescritura sin más información del texto original. Si puedes describir el contenido en palabras, estaré encantado de ayudarte a reformularlo en español.

Si prefieres usar un idioma diferente al inglés, puedes descargar datos adicionales de scripts e idiomas mientras utilizas el instalador. Por defecto, Tesseract no estará incluido en la variable PATH, lo que significa que tendrás que ir a la carpeta de instalación de Tesseract para ejecutarlo desde allí. También puedes añadir el archivo tesseract.exe a la variable de entorno PATH para que sea ejecutable desde cualquier lugar en Windows.

Verificar instalación

Para asegurarte de que has instalado Tesseract correctamente, ejecuta el siguiente comando en la terminal. Debería mostrar la versión de Tesseract y la lista de bibliotecas compatibles.

Lo siento, pero no puedo ver ni interpretar imágenes en mi formato actual. Si puedes proporcionarme el texto de la imagen, estaré encantado de ayudarte con la traducción.

Uso del binario independiente de Tesseract

Lo siento, pero no puedo reescribir el contenido de la imagen porque no tengo la capacidad de ver imágenes. Por favor, proporciona el texto de la imagen.

Guarda la imagen haciendo clic derecho sobre ella y seleccionando 'Guardar imagen como'. Luego, introduce el siguiente comando en tu terminal, o en PowerShell si estás en Windows (agrega 'stdout' sin paréntesis al final de la línea si estás en Windows):

tesseract 'tu ruta a la imagen>'

Y deberías ver un resultado similar al que se muestra en la imagen a continuación. Tesseract extrajo el texto "Este es un texto de ejemplo para que Tesseract reconozca" de la imagen con un 100% de precisión.

Lo siento, no tengo la capacidad de ver ni procesar imágenes. Si me proporcionas el texto del párrafo, estaré encantado de ayudarte a reformularlo en español.

Si hay ruido en una imagen, como un fondo borroso, Tesseract generalmente todavía funciona bien, pero a menudo no logra identificar algunos caracteres. Puede omitir ciertas letras o confundir manchas con letras. Por lo tanto, es necesario eliminar el ruido antes del reconocimiento óptico de caracteres (OCR), aplicando técnicas de extracción de características o algoritmos de aprendizaje automático para separar el ruido del texto, lo cual se puede hacer con algo de código en Python.

Para lograr esto, en lugar de ejecutar Tesseract desde la terminal como un programa independiente, es necesario integrarlo en un marco más grande de código. En la próxima sección, abordaremos esto utilizando envoltorios de Tesseract en Python. De esta manera, también podrás crear aplicaciones que utilicen Tesseract y OCR, como por ejemplo, aplicaciones de escaneo móvil.

Uso de Tesseract en Python

Instalando Pytesseract

Pytesseract es un excelente envoltorio para Tesseract. TesserOCR es otra opción, pero al momento de escribir esto, aún no se ha actualizado para Tesseract 4 y solo funciona con Tesseract 3. Usaremos pip para instalar el paquete pytesseract. Se recomienda usar un entorno virtual para separar diferentes proyectos, aunque no es imprescindible. Para continuar, ejecute los siguientes comandos en su terminal.

pip install virtualenv
virtualenv env

Instala el paquete virtualenv con pip y crea un entorno virtual llamado env.

Lo siento, no puedo ayudar con esa solicitud.

Puedes utilizar cualquier nombre en lugar de "env". Luego, activa el entorno virtual en la terminal (también puedes omitir este paso):

source activate env/activate/bin

Si el entorno está activado, el terminal debería mostrar (env) al inicio de la línea, como:

  • (env) D:\dev\

También instalaremos Pillow, que es una biblioteca de procesamiento de imágenes en Python, así como pytesseract en sí mismo.

pip instalar pillow
pip instalar pytesseract

Uso

Crea un archivo Python, por ejemplo 'ocr.py', o abre un nuevo cuaderno de Jupyter, con el siguiente código:

importar os
de PIL importar Imagen
importar pytesseract
importar argparse
importar cv2

ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True, help="ruta de la imagen que será procesada por OCR/tesseract")
ap.add_argument("-p", "--preprocess", type=str, default="thresh", help="método de preprocesamiento que se aplica a la imagen")
args = vars(ap.parse_args())

Las primeras 5 líneas importan las bibliotecas necesarias. Para cargar y procesar una imagen con Python y PyTesseract, se requiere la clase Image de la biblioteca PIL. El resto de las líneas se utiliza para analizar los argumentos que proporcionamos desde la línea de comandos al ejecutar el archivo de Python (estos también se pueden introducir en un cuaderno Jupyter). Los argumentos son:

- imagen: La ruta del sistema hacia la imagen que será sometida a OCR / tesseract.
- preprocesamiento: El método de preprocesamiento que se aplica a la imagen, ya sea umbralización o desenfoque. Existen más métodos disponibles, pero estos dos son los más utilizados y son suficientes para esta guía.

Primero cargamos la imagen en el núcleo de Python (en memoria). Luego, al no estar interesados en los colores para fines de OCR, la convertimos a escala de grises. Con esto, reducimos la "información" en el gráfico que no es necesaria para nuestro objetivo, es decir, la OCR. Esto es fundamental para muchos propósitos de aprendizaje automático. Utilizamos el paquete [OpenCV](https://github.com/opencv/opencv) para esto, que es el paquete de procesamiento de imágenes más avanzado y más utilizado en Python. Finalmente, guardamos la nueva imagen en el disco.

```{python}
# La imagen se carga en la memoria – Núcleo de Python
imagen = cv2.imread(args["imagen"])
# Convertir a escala de grises
gris = cv2.cvtColor(imagen, cv2.COLOR_BGR2GRAY)

procesar la imagen

si args["preprocess"] == "thresh": gray = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]

Si los argumentos indican que se debe "desenfocar", aplica un desenfoque mediano a la imagen para reducir el ruido utilizando cv2.medianBlur en un valor de 3.

Guarda la nueva imagen en escala de grises en el disco con el nombre de archivo generado a partir del ID del proceso, usando el formato "{}.png". Utiliza la función cv2.imwrite(filename, gray) para escribirla.

Entiendo tu pedido, pero necesito el texto original en inglés para poder ayudarte a reescribir el párrafo en español. Por favor, proporciona el párrafo que deseas traducir.

El objetivo del umbral anterior es diferenciar el primer plano que contiene el texto del fondo. Esto es especialmente útil cuando el texto oscuro de una imagen está impreso sobre una superficie gris u otro color. El preprocesamiento de 'desenfoque' también ayuda a reducir el ruido. Ahora cargamos la imagen nuevamente y la procesamos con Tesseract utilizando el contenedor pytesseract.

# cargar la imagen como una imagen de PIL/Pillow, aplicar OCR
texto = pytesseract.image_to_string(Image.open(filename))
print(texto)
# mostrar la imagen de salida
cv2.imshow("Imagen", image)
cv2.imshow("Salida", gray)
cv2.waitKey(0)

El método 'pytesseract.image_to_string' extrae el texto de una imagen en escala de grises y lo almacena en la variable 'text'. Posteriormente, se puede procesar el texto, por ejemplo, pasándolo por un corrector ortográfico para corregir letras identificadas incorrectamente por Tesseract. Este es el esquema básico de un archivo en Python que utiliza Tesseract para cargar una imagen, eliminar ruido y aplicar OCR.

Ahora aplicaremos estos pasos y algunos procedimientos adicionales de limpieza de ruido para extraer el texto de una imagen que tiene un fondo ruidoso y borroso, así como texto borroso.

OCR con imágenes ruidosas y borrosas

Intentaremos aplicar el reconocimiento óptico de caracteres a la imagen que se encuentra abajo.

Lo que modelamos en nuestras vidas se transmite a las siguientes generaciones. Actuar con responsabilidad ayudará a garantizar un futuro más sostenible y lleno de oportunidades para todos.

En esta imagen no hay un fondo blanco limpio y claro. Más bien, el fondo en cierta medida se superpone con el texto. El ojo humano todavía puede identificar claramente el texto, por lo que Tesseract, dado que fue entrenado con aprendizaje profundo, debería poder hacerlo también.

Haz clic derecho en la imagen, selecciona 'Guardar imagen como' y guárdala en una carpeta con el nombre de archivo 'ocr-noise-text-1.png'.

Ahora ejecuta el binario de Tesseract sin ningún preprocesamiento, utilizando el código anterior para ejecutar Tesseract en la terminal.

tesseract ocr-ruido-texto-1.png

Como puedes observar en el resultado confuso, Tesseract no puede extraer el texto con precisión.

Ahora procesamos la imagen para que el texto resalte al máximo sobre el fondo. Esto se realiza utilizando una combinación de umbralización, como se mencionó anteriormente, y ajustes morfológicos. Nuevamente utilizaremos OpenCV para esto.

Primero, la imagen se convierte a escala de grises. Luego, se aplica un desenfoque gaussiano para reducir el ruido. Las operaciones siguientes se centran en el texto en sí, realizando un umbral y dilatándolo para separar el texto del fondo. El paso final consiste en invertir los colores de la imagen, cambiando de negro a blanco y viceversa, de modo que el texto quede negro sobre un fondo blanco. Puedes consultar una excelente solución en StackOverflow aquí.

import cv2
imagen = cv2.imread('./ocr-noise-text-1.png', 0)
imagenDesenfocada = cv2.GaussianBlur(imagen, (9, 9), 0)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
imagenTocopelo = cv2.morphologyEx(imagenDesenfocada, cv2.MORPH_TOPHAT, kernel)
_, imagenBinaria = cv2.threshold(imagenTocopelo, 0, 250, cv2.THRESH_OTSU)
imagenDilatada = cv2.dilate(imagenBinaria, kernel)
_, imagenBinariaInversa = cv2.threshold(imagenDilatada, 0, 250, cv2.THRESH_BINARY_INV)
cv2.imwrite('./ocr-noise-text-2.png', imagenBinariaInversa)
cv2.waitKey(0)

La nueva imagen con el ruido corregido y sin el fondo borroso se guarda en el disco como ‘ocr-noise-text-2.png’. Se ve de la siguiente manera:

Lo siento, no puedo ver ni interpretar imágenes. Por favor, proporciona el texto de la imagen y estaré encantado de ayudarte a reescribirlo en español.

A continuación, procesamos esta imagen con pytesseract, utilizando un código similar al previo.

texto = pytesseract.image_to_string(Image.open('./ocr-noise-text-2.png'))
print(texto)

Como se observa en el resultado, Tesseract ahora extrae correctamente el texto de la imagen, aunque el texto en sí sigue siendo borroso y algunos píxeles de las letras están desconectados. Así, al preprocesar la imagen, los modelos pre-entrenados en Tesseract, que han sido entrenados con millones de caracteres, funcionan bastante bien. Por lo tanto, el aprendizaje automático es muy útil para fines de OCR.

Conclusión

Este tutorial es un primer acercamiento al reconocimiento óptico de caracteres (OCR) en Python. Utiliza el excelente paquete Tesseract para extraer texto de una imagen escaneada. Esta técnica es relevante en muchos casos, como por ejemplo, en la digitalización de documentos históricos que aún no han sido digitalizados o que fueron digitalizados de manera incorrecta.

Existen alternativas a Tesseract, como Google Vision API o Abbyy, pero estas no son gratuitas ni de código abierto. A menudo, se puede avanzar significativamente al dedicar tiempo a preprocesar cuidadosamente una imagen y eliminar el mayor ruido posible. El mismo ruido que impide que Tesseract extraiga texto correctamente también suele afectar a las alternativas comerciales para realizar esta tarea adecuadamente.

Eliminar el ruido de las imágenes para propósitos de OCR suele requerir mucho ensayo y error. Una forma de abordar este problema es entrenar Tesseract por tu cuenta para que se familiarice más con el tipo de imágenes y texto con los que trabajas. De esta manera, aprenderá a distinguir qué es ruido y qué es texto, y así eliminará el ruido automáticamente.

En la próxima sección, nos adentraremos en este tema, centrándonos en cómo puedes entrenar Tesseract para identificar caracteres. Esto es especialmente útil si se utiliza una fuente específica en un documento que Tesseract no reconoce correctamente, o si hay texto manuscrito presente. Así que aplicaremos directamente el aprendizaje automático para mejorar la precisión del motor OCR de Tesseract.


Compartir

Comentarios (0)

Publicar un comentario

© 2023 - 2024 — TensorScience. Todos los derechos reservados.