En este apunte práctico voy a revisar cómo extraer el texto contenido en una imagen “.jpg” para utilizarlo como texto dentro de otros documentos.
Para esto vamos a utilizar las siguientes herramientas: Python, OpenCV y Tesseract.
Estamos recorriendo una época de grandes avances en LLM e inteligencia artificial, y las tareas de visión por computadora son cada vez más sorprendentes. Incluso la tarea que vamos a realizar a continuación me resulta sorprendente, aunque al momento de escribir esto pueda resultar algo común para otras personas.
Pero sin más introducción, vamos a empezar.
¿Qué nos interesa hacer?
Empecé a escribir esta entrada porque necesitaba extraer los datos de una tabla que se encontraba guardada en formato .jpg y no quería hacer el esfuerzo de copiarla por mi propia cuenta.
El resultado fue bueno, aunque tuve que hacer algunos ajustes manualmente para obtener toda la información. Recuerden que no soy experto en el tema, solamente un simple principiante y tienen que existir muchas formas de mejorar mi aproximación al problema.
Para los efectos de esta entrada digamos que queremos extraer el texto de la siguiente imagen:

Si queremos hacer esto vamos a necesitar tener algunas cosas en nuestra computadora.
Lista de cosas que necesitamos
Tengan en cuenta que estoy utilizando un sistema operativo Linux. Los detalles para las siguientes instalaciones pueden variar según el sistema que elijas.
Instalar Tesseract a nivel global
Tesseract es un motor de Reconocimiento Óptico de Caracteres (ROC). En resume vamos a necesitarlo para extraer el texto de la imagen.
Primero necesito instalar Tesseract al nivel de sistema:
sudo apt install tesseract-ocr
Ahora si escribo el comando:
tesseract --list-langs
Voy a conseguir que librerías de lenguaje tengo agregadas. Al principio intenté extraer el texto sin la librería para Español, y tuve buenos resultados. Pero por ejemplo aparecían problemas, la letra “ó” con tilde se mostraba en el documento como “é”.
Para resolverlo necesito agregar la librería en Español, y lo hago con este otro comando:
sudo apt install tesseract-ocr-spa
Crear un entorno de Python e instalar pytesseract
Voy a crear un entorno virtual en Python. Lo hago en el directorio en el que voy a ejecutar el código:
Ahora instalo Pytesseract dentro del entorno virtual:
pip install pytesseract
Pytesseract es un librería que le permite interactuar con Python al motor de reconocimiento que instalamos antes.
Instalar Opencv
Necesito ahora, otra vez dentro del entorno virtual agregar otra librería llamada Opencv:
pip install opencv-python
Con eso consigo agregar OpenCV (Biblioteca de Visión Computacional de Código Abierto) a mi entorno. Entre las cosas que nos va a permitir hacer esta librería se encuentra la posibilidad de procesar la imagen para mejorar las posibilidades de un reconocimiento de texto exitoso.
El código
Comparto el código completo para poder extraer el texto de una imagen “.jpg” para que puedas utilizarlo y modificarlo:
# Programa para extraer el texto de una imagen y pasar a un archivo. # OpenCV para pre-procesar la imangen y Tesseract OCR para extraer el texto import cv2 import pytesseract import os import sys def preprocess_image(camino_imagen): image = cv2.imread(camino_imagen) if image is None: raise ValueError("Revisar el camino al directorio, no se pudo encontrar la imagen.") gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # Convierte la imagen a escala de grises blurred = cv2.GaussianBlur(gray_image, (3, 3), 0) # Aplica un desenfoque Gaussiano para reducir el ruido threshold_image = cv2.adaptiveThreshold( blurred, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2 ) return threshold_image # adaptive thresholding aplicado en el paso anterior para mejorar la lectura de la imagen def extraer_texto(image, config=None): return pytesseract.image_to_string(image, lang='spa', config=config) def main(): DEFAULT_OUTPUT_CONFIG = "--psm 6 -c page_separator=''" # --psm 6 asume un texto uniforme if len(sys.argv) < 2: print("Modo de uso: python texto_imagen.py [camino_imagen]") #si se usan menos de dos argumentos, explica cómo llamar el script sys.exit(1) camino_entrada = sys.argv[1] if not os.path.isfile(camino_entrada): print("revisr el nombre de archivo o el camino al directorio") # mensaje de error si falta el nombre de la imagen sys.exit(1) # Check if the file has a .jpg extension (case-insensitive) filename = os.path.basename(camino_entrada) if os.path.splitext(filename)[1].lower() not in ('.jpg', '.png'): print("Error, solamente se pueden utilziar archivos .jpg o .png") sys.exit(1) try: preprocessed = preprocess_image(camino_entrada) text = extraer_texto(preprocessed, DEFAULT_OUTPUT_CONFIG) script_dir = os.path.dirname(os.path.abspath(__file__)) archivo_salida = os.path.join(script_dir, "texto_procesado.txt") with open(archivo_salida, 'w', encoding='utf-16') as f: f.write(text) print(f"El texto fue extraido y guardado como {archivo_salida}") except ValueError as ve: # Manejo de errores, por ejemplo si la imagen provista no es del tipo de archivo adecuado. print(f"Value error: {ve}") sys.exit(1) except pytesseract.TesseractError as te: print(f"Tesseract error: {te}") sys.exit(1) except Exception as e: print(f"Error inesperado: {e}") sys.exit(1) if __name__ == "__main__": main()
Algo importante a tener en cuenta es que el código tiene una clausula que se asegura que el archivo tenga la extensión “.jpg” o “.png” antes de procesarlo. Esto no es completamente necesario, porque las librerías que agregamos pueden usar otro tipo de archivos. Pero lo puse para asegurarme de no confundirme al utilizarlo en mi caso.
Si te sirve podés extraer el texto de la misma imagen que compartí más arriba para poder probar el código más rápido.
¿Cómo utilizar el código?
El código se invoca con este formato:
python texto_imagen.py [camino_imagen]
Tengan en cuenta que “texto_imagen.py” es el nombre con el que guardé el código en mi caso, podés modificarlo por el nombre que más quieras usar.
Conclusión
Con esto llega al final de mi apunte sobre cómo extraer el texto de una imagen utilizando Python, Tesseract y OpenCV.
En mi propio caso es como una primera aproximación al tema, puedo decir que aprendí mucho haciendo este material.
¿Te interesa el tema? ¿Encontraste algún error en mi explicación? Me interesa leer tu opinión, por favor envíame un correo electrónico con tu mensaje.
La seguimos en el próximo apunte
Leave a Reply