Imagens De Leitura - Mais de 400.000 imagens grátis de Fundo Leitura e Leitura - Pixabay
Mais de 400.000 imagens grátis de Fundo Leitura e Leitura - Pixabay

Guia prático para extrair texto de imagens usando OCR

Imagens de leitura, tecnicamente chamadas de OCR (Optical Character Recognition), são o processo de converter pixels de uma foto ou em caracteres de texto que um computador pode ler e editar. Parece simples, mas na prática existem dezenas de pequenos detalhes que fazem o resultado cair de 95% de precisão para 40% se você não souber o que está fazendo. Vou explicar como configurar, o que funciona, e onde tudo dá errado.

Como funciona a extração de texto de imagens

O motor OCR analisa a imagem pixel a pixel, identifica padrões que se parecem com letras e números, e os converte para uma string de texto. O problema é que ele não "entende" o conteúdo. Se a imagem estiver torta, borrada, ou com ruído de fundo, o motor vai tentar ler mesmo assim e produzir resultados absurdos com a cara de confiança. No meu caso, trabalhando com documentos escaneados de arquivos públicos antigos, encontrei uma situação específica que ilustra bem isso: tinha uma série de recibos dos anos 1970 com tinta desbotada e papel amarelado por umidade. O Tesseract padrão retornava algo como "Rrcibo n. 3.456" quando na imagem estava claramente "Recibo n. 3456". A solução foi aplicar um pré-processamento com OpenCV antes de enviar para o OCR: conversão para escala de cinza, depois threshold adaptativo com bloco de 25 pixels e constante C=2. Isso isolou o texto do fundo amarelado e elevou a precisão de aproximadamente 62% para 89% nos campos chave.

O fluxo básico que recomendo é: receber a imagem corrigir inclinação (deskew) ajustar contraste converter para preto e branco binário executar OCR pós-processar o texto com expressões regulares se necessário.

Configurando a ferramenta mais acessível

A opção mais prática e gratuita é o Tesseract OCR, mantido pelo Google. Ele roda localmente, não requer API key, e suporta português nativamente. A instalação em sistemas baseados em Debian é direta: No Ubuntu/Debian: sudo apt install tesseract-ocr tesseract-ocr-por

No macOS: brew install tesseract tesseract-lang Depois disso, use a biblioteca pytesseract no Python para facilitar a integração. O código mínimo funciona assim:

import pytesseract
from PIL import Image

imagem = Image.open("documento.png")
texto = pytesseract.image_to_string(imagem, lang="por")
print(texto)
Isso já produz resultados razoáveis com imagens limpas em resolução de pelo menos 300 DPI. Abaixo disso, a precisão cai significativamente porque os caracteres ficam com poucos pixels de altura.

👉 Clique no botão abaixo para saber mais sobre o assunto!

Imagens de leitura: otimizações que fazem diferença real

Aqui estão duas coisas que quase ninguém menciona e que alteram drasticamente o resultado. Primeiro: a configuração de paginação do Tesseract influencia diretamente a precisão. O valor padrão "single_block" assume que todo o texto está em uma única coluna. Se o documento tiver múltiplas colunas, uso "auto" ou "single_column" dependendo do layout. Errar essa configuração causa quebras estranhas no meio das linhas, como se o OCR "pular" de uma coluna para outra sem lógica.

Segundo: o modelo de idioma correto é essencial. O Tesseract possui modelos separados para português e espanhol. Usar o modelo "eng" em um documento inteiramente em português gera erros frequentes de confusão entre letras como "ç" e "c", ou "ã" e "a", porque o motor não tem vocabulário ortográfico português carregado. Sempre passe lang="por" explicitamente. Em documentos bilíngues, use lang="por+eng". Uma limitação importante que precisa ser dita francamente: OCR tradicional baseado em Tesseract não lida bem com handwriting (escrita à mão). Se sua imagem contém anotações manuscritas, a precisão pode cair para 30-50%, dependendo da legibilidade. Nesse caso, a alternativa é usar APIs como Google Cloud Vision ou Amazon Textract, que possuem modelos de deep learning treinados especificamente para caligrafia. O custo é muito mais alto — cerca de $1,50 por 1.000 páginas no caso do Textract — mas para volumes pequenos compensa.

Pré-processamento com OpenCV

Para documentos com qualidade ruim, o passo de pré-processamento é onde a maioria dos resultados ruins nasce. Um pipeline comum que funciona na maioria dos casos: import cv2
import numpy as np

imagem = cv2.imread("documento.jpg")
cinza = cv2.cvtColor(imagem, cv2.COLOR_BGR2GRAY)
binaria = cv2.adaptiveThreshold(cinza, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 25, 2)

cv2.imwrite("processada.png", binaria)

O threshold adaptativo é superior ao threshold global porque calcula um limite diferente para cada região da imagem, lidando melhor com sombras e iluminação irregular. Documentos escaneados com vinheta ou luz desigual — algo comum com scanners baratos — se beneficiam muito dessa abordagem. Para correção de inclinação, o Tesseract possui uma função embutida via image_to_data() que retorna as coordenadas de cada palavra, mas para casos mais robustos, a biblioteca img2pdf combinada com detecção de linhas pelo OpenCV (Hough Line Transform) resolve inclinações de até 15 graus com boa precisão.

Quando o OCR falha completamente

Existem cenários onde nenhuma configuração vai salvar. Imagens com resolução abaixo de 150 DPI são praticamente ilegíveis para qualquer motor. Textos sobre fundos texturizados — como papel timbrado com logo colorido, ou documentos com marca d'água — produzem ruído excessivo. E imagens de telas (screenshots) com Moire pattern geram artefatos que confundem o algoritmo. Para o caso de Moire, a solução é aplicar um leve blur gaussiano (raio 1-2 pixels) antes do threshold, o que suaviza as franjas sem perder os caracteres. Já para fundos texturizados, o tratamento de imagem baseado em morphological operations — especificamente cv2.morphologyEx() com um kernel de abertura — consegue remover textura de fundo mantendo o texto intacto.

Se você trabalha com alto volume e precisa de confiabilidade próxima de 99%, o caminho mais viável hoje é combinar Tesseract local para o rascunho inicial com validação humana nos trechos com menor confidence score (o Tesseract retorna um score de confiança para cada palavra). Assim você revisa apenas o que realmente precisa de atenção, em vez de revisar tudo cegamente.