fbpixel
Etiquetas: , , ,

Neste tutorial, vamos ver como reconhecer texto de uma imagem usando Python e Tesseract. O Tesseract é uma ferramenta para reconhecer caracteres, e portanto texto, contidos numa imagem (OCR, Optical Character Recognition).

Instalar o Tesseract

  • Em Linux

Para instalar o tesseract, introduza os seguintes comandos num terminal

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

pode descarregar e executar o instalador para o seu sistema operativo

Quando a instalação estiver concluída, adicione C:\Program Files\Tesseract-OCR à sua variável de ambiente Path.

Pode agora executar o tesseract e testar o resultado com o seguinte comando

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

ex:

tesseract test.png result -l fra

O Tesseract reconhecerá o texto contido na imagem test.png e escreverá o texto em bruto no ficheiro result.txt.

tesseract-result1 Reconhecimento de texto com Python

N.B.: O Tesseract pode ter dificuldades com a pontuação e o alinhamento do texto.

tesseract-result2 Reconhecimento de texto com Python
tesseract-result3 Reconhecimento de texto com Python
tesseract-result4 Reconhecimento de texto com Python

Reconhecimento de texto com o Pytesseract

Pode então instalar o pacote pytesseract

pip install pytesseract

A vantagem de utilizar Python, e OpenCV em particular, é que pode processar imagens e implementar a ferramenta em pacotes de software maiores. Segue-se uma lista de algumas das vantagens:

  • deteção de texto num vídeo
  • Processamento e filtragem de imagens para caracteres obstruídos, por exemplo
  • Detetar texto de um ficheiro PDF
  • Escrever os resultados num ficheiro Word ou Excel

No script seguinte, carregamos a imagem com o OpenCV e desenhamos rectângulos à volta do texto detectado. Os dados de posição são obtidos utilizando a função image_to_data. O texto em bruto pode ser obtido utilizando a função 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 Reconhecimento de texto com Python

O guião também funciona com fotografias de documentos

pytesseract-opencv-result Reconhecimento de texto com Python

Bonus: Reconhecimento de texto com Python à partir d’un fichier PDF

Instalando a biblioteca pdf2image

pip install pdf2image

O pdf2image requer que o poppler esteja instalado

Bastante simples no Linux

sudo apt-get install poppler-utils

Para Windows

  • Descarregar o ficheiro zip
  • Extraia os ficheiros para onde desejar (C:
  • Adicione a pasta bin à variável de ambiente Path (C:\Users\ADMIN\Documents\poppler\Library\bin)
  • teste com o comando pdftoppm -h

Script para recuperar texto de um 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 apresentar rectângulos num 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 Reconhecimento de texto com Python

Aplicações

  • Ler documentos digitalizados
  • Reconhecimento de texto em tempo real a partir de vídeo

Fontes