Atenção para os prazos da Maratona Behind the Code! Saiba mais

Digitalize e extraia texto de uma imagem usando bibliotecas Python

Neste tutorial, você aprenderá como extrair textos e números de uma imagem digitalizada e converter um documento PDF para uma imagem PNG usando bibliotecas Python, como a wand, pytesseract, cv2, e PIL.

Você utilizará um tutorial da pyimagesearch para a primeira parte. Em seguida, estenderá esse tutorial ao incluir a extração de texto.

Objetivos de aprendizagem

Ao concluir este tutorial, o leitor entenderá como:

  • Construir um scanner de documentos (baseado no pré-requisito).
  • Aprimorar o scanner de documentos para extrair texto e números.

Pré-requisitos

Este não é um tutorial para iniciantes. Pois requer conhecimento de Python, Open CV e Processamento de linguagem natural. Este tutorial se baseia em um tutorial escrito pelo contribuidor da pyimagesearch, Adrian Rosebrock, detalhando Como construir um scanner de documentos móvel fenomenal em apenas 5 minutos.. Recomenda-se ler todo esse tutorial para entender como digitalizar documentos ao detectar bordas, encontrar contornos e aplicar transformações.

Tempo estimado

A conclusão deste tutorial deve levar cerca de 30 minutos.

Etapas

Redimensionando a imagem

Como iremos concluir nosso objetivo de extração de texto? Primeiro, iremos redimensionar a imagem usando cv2.redize, com um valor de altura de 1150 e largura de 1350 pixels. Esta imagem é então salva no disco. O código para realizar esta etapa, assim como a saída redimensionada podem ser vistos abaixo.

imS = cv2.resize(warped, (1350, 1150))
cv2.imshow("output",imS)
cv2.imwrite('Output Image.PNG', imS)
cv2.waitKey(0)

A imagem contém um texto que será utilizado para a extração

Extraindo texto do documento

Para extrair texto da imagem, podemos utilizar as bibliotecas PIL e pytesseract Atualmente, executamos esta etapa para uma única imagem, mas isso pode ser facilmente modificado para se repetir sobre um conjunto de imagens. Podemos melhorar a precisão da saída pelo ajuste preciso dos parâmetros, porém o objetivo é mostrar a extração de texto. O código para realizar esta etapa, assim como a saída da extração de texto podem ser vistos abaixo.

from PIL import Image
import PIL.Image

from pytesseract import image_to_string
import pytesseract

pytesseract.pytesseract.tesseract_cmd = 'C:/Program Files (x86)/Tesseract-OCR/tesseract'
TESSDATA_PREFIX = 'C:/Program Files (x86)/Tesseract-OCR'
output = pytesseract.image_to_string(PIL.Image.open('Output Image.PNG').convert("RGB"), lang='eng')
print output

Esta é imagem do texto extraído

Classificando o documento

Como classificamos os documentos com base nos seus conteúdos? A resposta é extrair o texto do documento e alimentá-lo a uma função definida pelo usuário com uma lógica de se-então-senão e funcionalidade de loop para identificar o nome do documento.

Extrair número da imagem

Este objetivo pode ser alcançado usando cv2. O documento de entrada é uma imagem bimodal, o que significa que a maioria dos pixels são distribuídos ao longo de duas regiões dominantes. Abaixo, está a nossa imagem de entrada.

A cv2 tem um método para binarização de OTSU, que funcionaria para imagens bimodais. Ela assume que a distribuição de intensidades de entrada seja bimodal e tenta encontrar o limite ideal. A binarização de OTSU calcula automaticamente um valor limite, a partir do histograma de imagem, para uma imagem bimodal. O código para realizar esta etapa, assim como a saída da binarização de OTSU podem ser vistos abaixo.

import cv2

img = cv2.imread("input_image.png", 0)
ret, thresh = cv2.threshold(img, 10, 255, cv2.THRESH_OTSU)
print "Threshold selected : ", ret
cv2.imwrite("./output_image.png", thresh)

Converter pdf para imagem png

Por último, fornecemos um pequeno trecho de código que utiliza wand para converter um PDF para um PNG.

from __future__ import print_function

from wand.image import Image

with Image(filename='sample_doc.pdf') as img:

    print('width =', img.width)
    print('height =', img.height)
    print('pages = ', len(img.sequence))
    print('resolution = ', img.resolution)

with img.convert('png') as converted:
     converted.save(filename='sample_doc.png')

Resumo

Isto conclui o escopo para proporcionar uma visão geral sobre digitalização de documento, reconhecimento de imagem, extração e classificação de texto. Fique à vontade para explorar adiante nas bibliotecas aqui mencionadas e aprimorar o código para atender às suas necessidades.