Leitura Da Imagem - Atividade Leitura de Imagem | PDF
Atividade Leitura de Imagem | PDF

Configurando leitura da imagem no dia a dia

A maioria das pessoas começa com Tesseract, baixa o binário, instala e já espera que funcione. Não funciona. Pelo menos não na primeira tentativa. O problema real não é o motor de OCR em si, mas sim o que acontece antes e depois dele rodar. O pipeline que eu uso hoje leva uns quinze minutos para estruturar e depois roda relativamente rápido, dependendo do tamanho dos arquivos. Se você tem dezenas de imagens pra processar, o custo inicial de configuração compensa.

O que é leitura da imagem e por que ela falha

Leitura da imagem, basicamente, é transformar pixels em texto. A gente chama de OCR, Optical Character Recognition, mas a sigla não explica por que às vezes o resultado sai como se fosse um azarinho. Um PDF escaneado com baixa resolução, uma imagem levemente torta, texto colado em fundo texturizado — qualquer uma dessas coisas pode fazer o motor tentar adivinhar caracteres que nem são legíveis para humanos. Um detalhe que muita gente perde: o Tesseract foi treinado predominantemente em imagens de alta qualidade, com contraste forte entre texto e fundo. Quando o scanner joga tudo num cinza desbotado ou com ruído de compressão JPEG, o resultado cai rápido. Eu vi um projeto inteiro travar por isso, achando que o modelo estava ruim. O modelo tava normal. A imagem era o problema.

Pré-processamento é onde a maior parte do tempo vai

Aqui é onde o processo muda. Antes de passar a imagem pro motor, você precisa tratar ela. As etapas mais importantes são simples, mas precisam ser feitas na ordem certa. 1. Converter para escala de cinza. A maioria dos modelos de OCR não precisa de informação de cor. Remover o canal colorido reduz ruído desnecessário e acelera o processamento. Use OpenCV pra isso, linha única: cv2.cvtColor(imagem, cv2.COLOR_BGR2GRAY).

2. Redimensionar com cuidado. Imagens muito pequenas fazem o Tesseract perder detalhes finos dos caracteres. O ideal é que o texto final tenha pelo menos 150 DPI. Se a imagem original vier com 72 DPI, um redimensionamento para 2x ou 3x antes do OCR faz diferença significativa. Cuidado só para não exagerar, porque imagens muito grandes aumentam o tempo de processamento sem ganho proporcional. 3. Binarização adaptativa. Isso é o passo mais negligenciado. Threshold fixo (o famoso cv2.threshold com type THRESH_BINARY) funciona bem em condições ideais, mas a vida raramente é ideal. A melhor alternativa é o threshold adaptativo: cv2.adaptiveThreshold. Ele calcula o limiar localmente, pixel por pixel, o que lida bem com sombras, iluminação irregular e gradientes no fundo.

4. Remoção de ruído. Depois da binarização, sobraram pontos brancos ou pretos soltos? Filtro mediana resolve rápido. cv2.medianBlur com kernel 3x3 já limpa bastante coisa sem distorcer os caracteres.

Executando o OCR propriamente dito

Com a imagem pronta, a chamada ao Tesseract é direta. O comando básico em Python fica assim: pyt.image_to_string(imagem_processada, lang='por', config='--psm 6')

O parâmetro lang='por' ativa o português. O config com --psm 6 diz pro motor que ele deve tratar a imagem como um bloco uniforme de texto, o que funciona na maioria dos documentos. Existem outras opções de psm, como o 1 para layouts complexos ou o 3 para texto totalmente automático, mas 6 é um ponto de partida seguro. Se você precisa de mais precisão, instale os pacotes de linguagem separadamente. No Linux, o comando é algo como apt-get install tesseract-ocr-por. No macOS, brew install tesseract-lang. Sem o pacote de português instalado, o motor vai usar o inglês como fallback e o resultado em texto brasileiro fica imprevisível.

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

Um caso real que me custou dois dias

Eu estava processando imagens de notas fiscais emitidas por um sistema antigo que gerava PDFs com texto sobreposto a um fundo com textura de papel. O Tesseract lia cerca de 40% dos campos corretamente. O resto saía como caracteres aleatórios ou espaços vazios. A solução não era melhorar o modelo. Era remover a textura antes do OCR. Eu apliquei um filtro de mediana com kernel maior (5x5), depois fiz uma subtração do fundo usando cv2.bgsegm.bgsegm_bg_ESTIMATE, e só então passei para a binarização adaptativa. O índice de acerto subiu para cerca de 85%. Ainda não era perfeito, mas era funcional.

O que eu aprendi com isso: quando o OCR falha massivamente em partes específicas da imagem, o problema geralmente é visual, não algorítmico. Trate a imagem primeiro. Teste o resultado em preto e branco sem texto. Se ainda não dá pra ler olhando, o motor não vai conseguir.

Pitfalls comuns e alternativas

Existem armadilhas recorrentes. Uma delas é confiar cegamente no resultado do OCR sem validação. Documentos com campos numéricos, datas, CPFs — tudo isso tem formato previsível. Use expressões regulares pra validar. Se um campo que deveria ser um CPF veio como "324.89X.012-3Y", você sabe que ali houve erro e pode ajustar o pré-processamento naquele trecho específico. Outra armadilha é não lidar com imagens rotacionadas. O Tesseract não corrige rotação por conta própria de forma confiável. Se suas imagens vierem de scanners automáticos que às vezes engasgam, implemente uma verificação de ângulo usando cv2.minAreaRect ou simplesmente processe a imagem em múltiplas rotações (0, 90, 180, 270 graus) e escolha a que Mais confiança (confidence score). O Tesseract devolve scores por palavra quando você usa image_to_data em vez de image_to_string.

Se o Tesseract não basta — e em algum momento ele não vai bastar — existem alternativas. O Google Cloud Vision, o Azure Computer Vision e o AWS Textract são serviços pagos, mas oferecem precisão muito superior em cenários difíceis. O Textract, por exemplo, entende a estrutura de formulários e tabelas, algo que o Tesseract não faz nativamente. Para volumes pequenos e alta precisão exigida, o custo mensal fica na casa de poucos dólares. Para processamento em lote de milhares de documentos, o custo sobe e vale a pena investir num pipeline próprio com Tesseract bem ajustado. Também tem o EasyOCR, que é uma biblioteca Python com modelos baseados em deep learning. Ele é mais lento que o Tesseract mas lida melhor com imagens sujas e cenários variados. A escolha entre eles depende do seu cenário: velocidade e controle fino favorecem Tesseract; tolerância a imagens de baixa qualidade favorece EasyOCR ou serviços cloud.

Download e instalação prática

Para começar a rodar leitura da imagem localmente, você precisa de três coisas: Python 3.8+, Tesseract OCR instalado no sistema e as bibliotecas python-tesseract e OpenCV. No terminal:

pip install pytesseract opencv-python Para o Tesseract em si, o download depende do seu sistema operacional. No site oficial do projeto (github.com/tesseract-ocr/tesseract/wiki) você encontra os instaladores para Windows. No Ubuntu/Debian, o apt-get install tesseract-ocr já resolve. Para macOS, brew install tesseract.

Um arquivo de exemplo bem simples que você pode testar agora: import cv2
import pytesseract

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, 11, 2)
texto = pytesseract.image_to_string(binaria, lang='por')
print(texto)

Esse código faz o básico: converte pra cinza, aplica threshold adaptativo e extrai o texto. Se o resultado não satisfazer, volte nos passos de pré-processamento e ajuste os parâmetros do adaptiveThreshold — o valor 11 é o tamanho do bloco e o 2 é a constante subtraída. Aumentar o bloco ajuda em imagens com iluminação muito irregular, mas pode perder detalhes finos. É questão de testar.