fbpixel
Etiquetas: , , ,

En este tutorial veremos cómo reconocer texto de una imagen utilizando Python y Tesseract. Tesseract es una herramienta para reconocer caracteres, y por tanto texto, contenidos en una imagen (OCR, Optical Character Recognition).

Instalación de Tesseract

  • En Linux

Para instalar tesseract, introduzca los siguientes comandos en un terminal

sudo apt install tesseract-ocr
sudo apt install libtesseract-dev
  • Para Windows

puede descargar y ejecutar el instalador para su sistema operativo

Una vez finalizada la instalación, añada C:\Archivos de programa\Tesseract-OCR a su variable de entorno Path.

Ahora puede ejecutar tesseract y comprobar el resultado con el siguiente comando

tesseract <path_to_image> <path_to_result_file> -l <language>

ex:

tesseract prueba.png resultado -l fra

Tesseract reconocerá el texto contenido en la imagen test.png y escribirá el texto sin procesar en el archivo result.txt.

tesseract-result1 Reconocimiento de textos con Python

Nota: Tesseract puede tener dificultades con la puntuación y la alineación del texto.

tesseract-result2 Reconocimiento de textos con Python
tesseract-result3 Reconocimiento de textos con Python
tesseract-result4 Reconocimiento de textos con Python

Reconocimiento de textos con Pytesseract

A continuación, puede instalar el paquete pytesseract

pip install pytesseract

La ventaja de utilizar Python, y OpenCV en particular, es que puedes procesar imágenes e implementar la herramienta en paquetes de software más grandes. He aquí una lista de algunas de las ventajas:

  • detección de texto en un vídeo
  • Tratamiento y filtrado de imágenes para caracteres obstruidos, por ejemplo
  • Detectar texto de un archivo PDF
  • Escribir los resultados en un archivo Word o Excel

En el siguiente script, cargamos la imagen con OpenCV y dibujamos rectángulos alrededor del texto detectado. Los datos de posición se obtienen utilizando la función image_to_data. El texto en bruto se obtiene utilizando la función image_to_string

from PIL import Image
import pytesseract
from pytesseract import Output
import cv2
 
source = 'test.png'
img = cv2.imread(source)
text=pytesseract.image_to_string(img)
print(text)

d = pytesseract.image_to_data(img, output_type=Output.DICT)
 
NbBox = len(d['level'])
print ("Number of boxes: {}".format(NbBox))

for i in range(NbBox):
	(x, y, w, h) = (d['left'][i], d['top'][i], d['width'][i], d['height'][i])
	# display rectangle
	cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
 
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
pytesseract-result1 Reconocimiento de textos con Python

El script también funciona con fotos de documentos

pytesseract-opencv-result Reconocimiento de textos con Python

Bonus: Reconocimiento de textos con Python à partir d’un fichier PDF

Instalación de la biblioteca pdf2image

pip install pdf2image

pdf2image requiere la instalación de poppler

Bastante sencillo en Linux

sudo apt-get install poppler-utils

Para Windows

  • Descargar el archivo zip
  • Extraiga los archivos donde desee (C:
  • Añade la carpeta bin a la variable de entorno Path (C:³³Users³ADMIN³Documents³poppler³Library³bin)
  • prueba con el comando pdftoppm -h

Script para recuperar texto de un PDF

from pdf2image import convert_from_path, convert_from_bytes
from PIL import Image
import pytesseract
from pytesseract import Output

images = convert_from_path('invoice.pdf')

# get text
print("Number of pages: {}".format(len(images)))
for i,img in enumerate(images):
    print ("Page N°{}\n".format(i+1))
    print(pytesseract.image_to_string(img))

Script para mostrar rectángulos en un PDF

from pdf2image import convert_from_path, convert_from_bytes
from PIL import Image
import pytesseract
from pytesseract import Output
import cv2
import numpy

images = convert_from_path('invoice.pdf')
for i,source in enumerate(images):
	print ("Page N°{}\n".format(i+1))
	
	#convert PIL to opencv
	pil_image = source.convert('RGB') 
	open_cv_image = numpy.array(pil_image) 
	# Convert RGB to BGR 
	img = open_cv_image[:, :, ::-1].copy() 
	#img = cv2.imread(source)

	d = pytesseract.image_to_data(img, output_type=Output.DICT)
	 
	NbBox = len(d['level'])
	print ("Number of boxes: {}".format(NbBox))

	for j in range(NbBox):
		(x, y, w, h) = (d['left'][j], d['top'][j], d['width'][j], d['height'][j])
		# display rectangle
		cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
	 
	cv2.imshow('img', img)
	cv2.waitKey(0)
	cv2.destroyAllWindows()
pytesseract-opencv-pdf2image-result Reconocimiento de textos con Python

Aplicaciones

  • Lectura de documentos escaneados
  • Reconocimiento de texto en tiempo real a partir de vídeo

Fuentes