Nesse artigo será mostrado com Java como extrair textos editáveis de imagens utilizando o OCR (Optical Character Recognition) Tesseract, com o auxílio do wrapper tess4j para o código. Não é necessário ter muita experiência em Java, mas é recomendado que tenha familiaridade com comandos básicos do Linux.
A imaginação é mais importante que o conhecimento.
– Albert Einstein
Uma breve história
Fonte: GitHub - tesseract-ocr/tesseract: Tesseract Open Source OCR Engine
O Tesseract foi originalmente desenvolvido na Hewlett-Packard Laboratories Bristol e na Hewlett-Packard Co, Greeley Colorado, entre os anos de 1985 a 1994, com mais algumas mudanças, foi portado para Windows em 1996, além de alguns aprimoramentos em 1998. Em 2005 foi liberado a comunidade pela HP e desde 2006 é desenvolvido pela Google. Mais informações sobre Tesseract podem ser encontrada em https://github.com/tesseract-ocr/tesseract.
Optical Character Recognition
Segundo a Wikipédia:
OCR é um acrônimo para o inglês Optical Character Recognition, é uma tecnologia para reconhecer caracteres a partir de um arquivo de imagem ou mapa de bits sejam eles escaneados, escritos a mão, datilografados ou impressos. Dessa forma, através do OCR é possível obter um arquivo de texto editável por um computador.
O Tesseract é uma implementação de OCR de código aberto capaz de reconhecer mais de 100 línguas (configuráveis) com caracteres Unicode. Também é possível ensinar a reconhecer novas linguagens e padrões através do suporte a técnicas de machine learning disponível na biblioteca.
Basicamente o Tesseract funciona como uma aplicação de terminal, cuja API (libtesseract) é construída em C/C++. Para utilizar com Java é necessário utilizar chamada nativa (JNI/JNA) ou recorrer para umwrapper chamadoTess4j.
O Tess4j
De forma simples o Tess4J é um wrapper (um invólucro) que utiliza Java Native Access (JNA) para abstrair a integração nativa (C/C++) e expor a API do Tesseract através de classes e métodos Java.
O projeto foi criado pelo usuário Quan Nguyen em 2012, e vem tendo contribuições pela comunidade através do Github. O projeto está crescendo em popularidade, mas possui pouca documentação e exemplos, o que pode dificultar um primeiro contato de iniciantes. Apesar dos obstáculos o projeto está bem ativo e tem um fórum de discussão em Tess4J / Discussion / Help no SourceForge, que é uma fonte rica para quem tem familiaridade com o inglês. O suporte a problemas é realizado através do projeto no Github em Issues · nguyenq/tess4j · GitHub e continua bem ativo.
Configuração
Para utilizar a biblioteca do Tess4j é necessário apenas baixar a lib nas releases no GiitHub ou utilizar um gerenciador de dependência configurado com o repositório do Tess4j. Como o Tess4J é uma camada acima do Tesseract é necessário ter o mesmo configurado no sistema operacional, em Windows é necessário apenas instalar o Visual C++ 2015-2019 Redistributable, pois as libs são carregadas dinamicamente do próprio jar da lib.
No Linux também é simples, basta instalar pelo gerenciador de pacotes da distribuição utilizada conforme a documentação, caso tenha uma distribuição baseada em Ubuntu pode seguir esses comandos:
sudo apt-get install tesseract-ocr
sudo apt-get install tesseract-ocr-por
Os comandos instalam o Tesseract com suporte a língua portuguesa.
Codificando
Na internet realizei uma pesquisa sobre modelos de ofícios judiciais e logo encontrei a seguinte imagem:
A imagem possui uma boa qualidade e atende bem os requisitos do Tesseract. O projeto de exemplo foi criado para ser construído em Maven, logo é necessário configurar a dependência:
<dependency>
<groupId>net.sourceforge.tess4j</groupId>
<artifactId>tess4j</artifactId>
<version>4.5.2</version>
</dependency>
No projeto a imagem foi colocada em src/main/resources como teste.png, sendo criada a classe LerImagem.java com o seguinte código:
package com.ivanqueiroz.tess4tj.app;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
import java.io.File;
import java.io.IOException;
public class LerImagem {
public static void main(String[] args) throws IOException {
File imageFile = new File("./src/main/resources/teste.png");
Tesseract tess4j = new Tesseract();
tess4j.setDatapath("/usr/share/tesseract-ocr/4.00/tessdata");
tess4j.setLanguage("por");
try {
String result = tess4j.doOCR(imageFile);
System.out.println(result);
} catch (TesseractException e) {
System.err.println(e.getMessage());
}
}
}
No Linux é necessário configurar o Datapath do Tesseract além da linguagem do texto (no caso português). Após passar a imagem para o método doOcr o retorno é a String resultante do reconhecimento, que ao ser impressa, traz o seguinte resultado:
A taxa de assertividade foi bem alta, e poderia ser contornada com algum processo de correção de texto posterior.
Observações
O programa de exemplo é bem simples, nele o Tess4J recebe uma imagem e retorna uma string. Para o sucesso do OCR a qualidade da imagem utilizada influencia diretamente no grau de sucesso do reconhecimento, na documentação do Tesseract é recomendado que para um melhor desempenho a imagem possua:
dois canais de cores somente (preto e branco);
mínimo de 300dpi de resolução;
possuir o texto em um único idioma;
sem bordas excessivas no texto;
texto alinhado e sem ruídos;
altura do espaço superior ocupado pelo texto de no mínimo 10px.
O Tesseract já realiza um processo interno que segue esses passos, mas algumas vezes não é o suficiente.
Finalizando
Pretendo abordar em um futuro artigo, como melhorar as imagens adquiridas utilizando uma biblioteca que manipule a imagem buscando torná-la mais fácil de ser reconhecida para o Tesseract.
Disponibilizei o código em GitHub - ivanqueiroz/tess4tj: Exemplo de utilização do Tess4J para quem se interessar como base de estudo.
Espero trazer nova versão desse pequeno programa em um futuro artigo. Até a próxima!
Fontes
https://tesseract-ocr.github.io
GitHub - nguyenq/tess4j: Java JNA wrapper for Tesseract OCR API