En este artículo les voy a explicar cómo extraer texto desde una imagen utilizando Python, aprovechando que recientemente programé una pequeña herramienta para engañar captchas sencillos extraer el texto de imágenes generadas al azar. Se deberá tomar en cuenta que el ejemplo aquí mostrado, no ahonda en las fascinantes profundidades del Reconocimiento Óptico de Caracteres (OCR) para imágenes demasiado complejas, es simplemente una solución muy tosca para un problema sencillo. Queda en ustedes estudiar los principios del OCR, continuar y mejorar las técnicas de detección tuneando el uso de las librerías y también mejorar el post proceso de las imágenes. Les dejo el ejercicio a continuación para fines didácticos.
¿Qué vamos a necesitar?
1) Tesseract – Es un motor OCR (optical character recognition) que tiene más de 30 años en la industria, el cual permite extraer texto desde imágenes. Recomiendo la instalación en MacOS utilizando Homebrew.
1 |
$ brew install tesseract |
Si estás utilizando Linux -por ejemplo Ubuntu- lo más sencillo es utilizar apt-get.
1 |
$ sudo apt install tesseract-ocr |
* Si estás utilizando Windows, te recomiendo visitar el sitio del equipo de Tesseract y seguir las instrucciones para ese sistema operativo.
2) La librería PyTesseract, que es en realidad un wrapper en Python para el motor Tesseract, la instalaremos más adelante luego de crear nuestro entorno virtual.
3) También necesitarán un editor de texto, en este caso yo utilizo vscode.
Crear el Entorno Virtual
Las aplicaciones en Python utilizan paquetes y módulos que no forman parte de la librería estándar: a veces requieren una versión específica de una librería, ya sea porque se necesita que haya un bug solucionado en esa versión, o porque quizá la aplicación en cuestión tiene alguna otra dependencia. Eso significa que sería muy difícil de tener una instalación de Python en nuestro sistema que cumpla con todos los requerimientos de todas las aplicaciones. Es por ello que se propuso una solución a éste problema creando un entorno virtual para cada aplicación, que es en realidad un directorio que contiene una instalación de una versión específica de Python, junto con los paquetes adicionales necesarios para ejecutarla. Es así, como logramos que diferentes aplicaciones en un mismo sistema pueden usar cada una su entorno virtual propio (y diferente a los demás).
Para crear nuestro entorno virtual, primero elegimos en que carpeta queremos crearlo y ejecutamos el siguiente comando, que ejecuta el módulo venv:
1 |
python3 -m venv ocr-test |
Este comando creará el directorio ocr-test (si no existiera) y creará algunos directorios dentro que contienen una copia del interprete de Python junto con varios otros archivos necesarios para ejecutar la aplicación.
Luego debemos activar nuestro entorno virtual, utilizando el script activate. En MacOS o Linux y teniendo bash como consola el comando es:
1 |
source ocr-test/bin/activate |
Al activar el entorno virtual, podremos ver que nuestro prompt de la línea de comandos cambia y nos muestra el entorno virtual que estamos usando, por tanto podríamos decir que ese entorno está modificado para que al ejecutar Python utilice la versión definida junto con toda la instalación específica dentro de ese directorio.
1 2 |
juanmarcelo@mac demos % source ocr-test/bin/activate (ocr-test) juanmarcelo@mac ocr-test % |
Instalar los demás paquetes con pip
Dentro de nuestro entorno virtual (ocr-test), podemos utilizar el programa pip para instalar actualizar y eliminar paquetes.
Instalamos PyTesseract:
1 |
pip install pytesseract |
Para manejo de imágenes instalamos Pillow:
1 |
pip install Pillow |
– JIC – pueden listar todos los paquetes instalados en el entorno virtual utilizando pip list, por ejemplo:
1 2 3 4 5 6 |
(ocr-test) juanmarcelo@mac ocr-test % pip list Package Version ------------------ ----------- pytesseract 0.3.10 Pillow 9.2.0 ... y la lista continúa ... |
Trabajar con las imágenes
Tenemos la siguiente imagen para realizar nuestro ejemplo:
Es una imagen sencilla con el texto alineado horizontalmente y que no requiere de ningún proceso adicional.
La estructura de nuestro entorno virtual sería la siguiente:
Nuestro código sería el siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
from PIL import Image from pytesseract import pytesseract #Definimos la ubicación del ejecutable de tesseract path_to_tesseract = r'/usr/local/bin/tesseract' #Apuntamos tesseract_cmd hacia el binario de la línea anterior pytesseract.tesseract_cmd = path_to_tesseract #Definimos la ubicación de la imagen a procesar path_to_image = r'imagen1.png' #Abrimos la imagen con PIL img = Image.open(path_to_image) #Extraemos el texto de la imagen result = pytesseract.image_to_string(img) #Luego de procesada la imagen, mostramos el resultado print(result) |
Luego al ejecutar nuestro código Python desde línea de comandos, tenemos el siguiente output:
1 2 3 4 |
(ocr-test) juanmarcelo@mac ocr-test % python main.py Bienvenido Juan Marcelo (ocr-test) juanmarcelo@mac ocr-test % |
Como pueden apreciar el texto que imprimimos como resultado del proceso de la imagen coincide con el contenido de la misma. Se debe tomar en cuenta que no siempre se detectará correctamente el texto, también puede detectar espacios en blanco por demás o detectar erróneamente algunos caracteres o quizá confundir algunos caracteres con otros; entre ellos es muy común que confunda el número 8 con el número 3. También podemos especificar el idioma en el que se desea extraer el texto, mejorando así su extracción, por ejemplo usando el argumento lang=’por’ para el portugués:
1 |
result = pytesseract.image_to_string(img, lang='por') |
Pueden acceder al listado completo de idiomas en el siguiente enlace.
Espero les sirva.
Saludos.