Extraer Texto desde una Imagen utilizando Python

Estándar

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.

Si estás utilizando Linux -por ejemplo Ubuntu- lo más sencillo es utilizar apt-get.

* 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:

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:

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.

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:

Para manejo de imágenes instalamos Pillow:

– JIC – pueden listar todos los paquetes instalados en el entorno virtual utilizando pip list, por ejemplo:

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:

El archivo main.py es el que contiene nuestro código y la imagen a procesar es imagen1.png. Los demás archivos y directorios los crea python al ejecutar el módulo venv y crear nuestro entorno virtual.

Nuestro código sería el siguiente:

Luego al ejecutar nuestro código Python desde línea de comandos, tenemos el siguiente output:

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:

Pueden acceder al listado completo de idiomas en el siguiente enlace.

Espero les sirva.

Saludos.