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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
sudo apt install tesseract-ocr
sudo apt install libtesseract-dev
sudo apt install tesseract-ocr sudo apt install libtesseract-dev
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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
tesseract <path_to_image> <path_to_result_file> -l <language>
tesseract <path_to_image> <path_to_result_file> -l <language>
tesseract <path_to_image> <path_to_result_file> -l <language>

ex:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
tesseract prueba.png resultado -l fra
tesseract prueba.png resultado -l fra
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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
pip install pytesseract
pip install 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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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()
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()
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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
pip install pdf2image
pip install pdf2image
pip install pdf2image

pdf2image requiere la instalación de poppler

Bastante sencillo en Linux

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
sudo apt-get install poppler-utils
sudo apt-get install poppler-utils
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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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))
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))
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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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()
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()
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