Mostrando entradas con la etiqueta pytesseract. Mostrar todas las entradas
Mostrando entradas con la etiqueta pytesseract. Mostrar todas las entradas

miércoles, 22 de octubre de 2025

Textos. Python.

Textos en imágenes

Obtención del texto (II)



Aunque en la entrada anterior usamos Pillow como programa de procesamiento de imágenes (con una función muy simple, por cierto: cargar la imagen), lo cierto es que lo normal es que se haga uso de OpenCV por su mayor potencia y funcionalidad, así que tendremos que incorporarlo a nuestro arsenal de recursos de automatización del acceso a textos.


Pero lo que quedó patente en la [entrada anterior] es que para lo que lo utilizamos en ese script (plenamente exitoso, por cierto), Pillow es más que suficiente, así que cuando la imagen no presente mayores dificultades y su tratamiento sea tan simple como el realizado, podemos trabajar perfectamente con esa biblioteca con total confianza. 

Otra cosa es que el tratamiento a hacer de la imagen de referencia exija actuaciones de mayor complejidad. En ese caso es posible que OpenCV ofrezca mayor rendimiento, aunque sinceramente tengo mis dudas...

En todo caso lo mejor es que también practiquemos a extraer texto de imágenes usando OpenCV. Y a ello vamos tomando como referencia esta imagen, que en principio se presenta con mayor complejidad gráfica y también con mayor utilidad (obtener el texto de páginas escaneadas de cuentos o de libros de texto o de presentaciones ppt previamente convertidas en capturas de pantalla, por ejemplo)


Este es ahora el script:

import cv2
import pytesseract

#Asociar pytesseract a Tesseract
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'

# Cargar imagen
img = cv2.imread("img/img3.png")

# Convertir la imagen a escala de grises
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Aplicar threshold para convertir la imagen a binario
threshold_img = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]

# Pasar la imagen al progama OCR pytesseract
text = pytesseract.image_to_string(threshold_img, lang='spa')

# Imprimir el texto extraído
print(text)

Puedes apreciar que sustituimos Pillow por OpenCV (import cv2), biblioteca que usamos para cargar la imagen (img = cv2.imread("img/img3.png")), pero también para tratarla a fin de facilitar el escaneo final...
  • Primero la convertimos a escala de grises (gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY))
  • Y después la convertimos a binario (threshold_img = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1])
... aunque puedes comprobar que ninguna de las dos instrucciones es estrictamente necesaria y que su uso no cambia sustancialmente el resultado (que realmente es mejorable), pero lo que aquí es poco relevante, en otros contextos puede ser la diferencia entre un buen acceso al texto o un fracaso, así que bueno es saberlo, aunque ahora parezca que nos sobra.

El resto del script (no hay mucho más, pero es importante) es igual que en el script en el que usamos Pillow:
  • La conexión entre Tesseract y pytesseractpytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
  • El escaneo de la imagen (text = pytesseract.image_to_string(threshold_img, lang='spa'))
  • Y la visualización del texto en pantalla (print(text))
También en este caso obviamos el tratamiento del texto y su posible archivo como documento. Ambas tareas quedan pendientes para aplicaciones prácticas reales.

Textos. Python

Textos en imágenes

Obtención del texto (I)



Te supongo ya dispuesto a obtener texto de una imagen, esto es, con el software correctamente instalado. Partiendo de aquí vamos a practicar la extracción de texto de imágenes partiendo de material sencillo. Ya llegará el momento de aplicarnos a fondo en contextos reales de intervención.


Para empezar, un documento sencillo y poca pretensión de nivel de logro: nos conformaremos con obtener el texto que contiene la imagen y visualizarlo en el el Shell o en el cmd. Esta es la imagen...


... y este el script que explico a continuación:

import pytesseract
from PIL import Image

#Es necesario incluir la ruta a Tesseract para trabajar con pytesseract

pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'

# Cargar la imagen con Pillow
img = Image.open('img/img_txt.jpg')

# Extraer texto
texto = pytesseract.image_to_string(img, lang ='spa')

#Escribir el texto en pantalla
print(texto)

Como ves es un script muy simple en el que, además del módulo pytesseract también importamos la librería Pillow, concretamente su módulo básico (from PIL import Image), ya que la necesitamos para cargar la imagen (img = Image.open('img/img_txt.jpg')).

Pero fíjate (y es muy importante) que previamente deberemos incluir una instrucción que comunique pytesseract con Tesseract (existen otras opciones, pero esta es la más sencilla). De no hacerlo no funcionará el script y no obtendremos el texto.

pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
 
Te recomiendo que identifiques la ubicación de Tesseract en tu ordenador (será una dirección igual o muy similar a la mía) y copies esta instrucción al inicio de tus script.

La instrucción que sigue es la clave del procedimiento (texto = pytesseract.image_to_string(img, lang ='spa')), ya que emplea la función pytesseract image_to_string() que requiere dos parámetros, la imagen sobre la que trabajar y el idioma a aplicar (recuerda que en la instalación de Tesseract seleccionaste una serie de idiomas para aplicar OCR), que en nuestro caso es el español (lang ='spa').

Ahora sólo resta visualizar el texto obtenido por pantalla (print(texto)), aunque en una situación real posiblemente lo tendríamos que manipular para mejorar su legibilidad y posteriormente archivar en un documento txt (por ejemplo).




Textos. Python.

Textos en imágenes

Recursos OCR


Cuando hemos aprendido (más o menos) a obtener el texto que contiene un documento PDF, se nos presenta un nuevo desafío: obtener el texto presente en una imagen.


Tendremos ocasión de conocer diversas casuísticas en las que esto se da, pero por ahora nos quedaremos con lo siguiente: unos padres te presentan un informe de un servicio externo en formato papel (hecho muy común) y tú lo escaneas para disponer del documento en formato digital (de paso devuelves el papel a sus dueños) y cuando vas a acceder a su contenido con tus recientes habilidades de manejo de PDF mediante PyPDF2 resulta que el contenido es inaccesible porque, vete a saber por qué, lo que el documento PDF contiene es, en realidad, una imagen.  Se te presentan tres opciones (después de que se te pase el consiguiente cabreo): volver a solicitar el documento a los padres y comprobar que escaneas correctamente el documento como texto (si es que su calidad lo permite), imprimes el documento escaneado y vuelves a intentar un escaneo correcto (si es posible...) o aprendes a obtener el texto que contiene ese PDF que milagrosamente resulta ser una imagen.

A lo mejor la tercera opción resulta ser la más complicada, pero te aseguro que es la mejor, al menos en el medio plazo.

Esta un tanto rocambolesca situación no lo es tanto en la vida real en la que obtener texto de imágenes es una funcionalidad de mucho más uso del que pensamos. En nuestro caso como SEO tendremos muchas ocasiones para comprobarlo; algunas de ellas, como dije, las trataremos en este blog.

La solución Python tiene poco de milagrosa, ya que se basa precisamente en aplicar lo que deseamos desde un principio cuando escaneamos el documento: obtener un texto mediante tecnología OCR. Esta es la base del procedimiento: incorporar un software OCR y manejarlo desde Python.

El OCR es el programa Tesseract, que puedes descargar desde [este enlace] y la biblioteca Python que necesitas para trabajar con él es pytesseract, cuya web oficial tienes en [este enlace]. Te recomiendo que te tomes las cosas con calma y que consultes ambas webs antes de proceder a la instalación del software; esto es especialmente necesario para el OCR, ya que su instalación requiere cierto cuidado y debe ser previa a la de la biblioteca Python.