OCR de qualidade no Linux

Hoje fui desafiado a escanear e reconhecer algumas páginas no Linux. Vai acontecer um congresso de magnetismo aqui na UFF e o diretor tinha uma relação impressa (em má qualidade) dos bares e restaurantes de Niterói. Ele queria apenas a informação pois iria redigir uma outra relação para seguir os moldes do folder e cartaz do evento.

Eu já havia tentado o gocr e o ocrad mas não tinha gostado do resultado. Com algum tempo livre e muita disposição consegui resultados bastante satisfatórios. Deu trabalho, mas acho que vocês terão menos do que eu :)

Para um bom aproveitamento do programa de ocr é importante preparar a imagem a ser reconhecida. Para o meu caso, 350dpi foi o de melhor aproveitamento: menos de 200 nem pensar e mais de 600 também não melhorou muito. O texto estava em fontes de 14pt, é possível que um texto em 10 ou 12pt necessitem de uma maior resolução. O scanner é o da multifuncional HP PSC 1510. Eu escaneei em 350 dpi usando o plugin sane do Gimp. Um detalhe do que foi escaneado ( antes que alguém critique o português, a frase completa é Bares e Chopperias :-P ) :

Note que há muitas manchas cinzas, principalmente no entorno das letras. Vamos retirá-las. No Gimp, vá para Camadas → Cores → Limite. Esta operação vai transformar a figura escaneada em tons de cinza em uma figura preto e branco. O triângulo preto do meio, na janela Limite determina quem será branco e quem será preto. Escolha um valor bem alto: eu movi para 220 (o máximo 255): Ainda restam pontos isolados e as letras estão cheias de ruído. Para minimizar estes efeitos, vamos para Filtros → Desfocar → Desfocagem Gaussiana. Eu escolhi um raio pequeno para a desfocagem (3, no caso) Está quase bom. Para ficar melhor ainda, podemos repetir os dois passos anteriores (Limite e Desfocagem Gaussiana). Use um valor menor para o Limite agora (eu usei o default 127). Finalmente, temos:   Salve o arquivo como .png, por exemplo (o programa de reconhecimento só trabalha com tiff, mas achei melhor convertê-los pelo ImageMagick):

tjpp@~

convert figura.png figura.tif

Agora vamos compilar o Tesseract-OCR. A versão nos pacotes debian é a 1.02. No site já estamos na 2.0, que é muito melhor. Baixei o pacote http://tesseract-ocr.googlecode.com/files/tesseract-2.00.tar.gz, embora eu recomende que você visite o site e veja se tem alguma versão mais nova: programas no code.google estão em desenvolvimento. Os mais afoitos podem ainda instalar a versão svn. Na seção de downloads, baixe os pacotes de linguagens spa (Espanhol) e eng (inglês). Sim, não temos português ainda, mas vou mostrar como eu fiz. Não há como fugir do configure;make;make install. Depois desta famosa sequência, o pacote vai ser instalado no /usr/local. Descompacte os arquivos de linguagens em /usr/local/share/tessdata/. Verifique se o diretório e os arquivos tem permissão de leitura para qualquer usuário (o que eu baixei, não dava estas permissões). Faça

tjpp@~

sudo chmod -R a+r /usr/local/share/tessdata/

Vamos criar um pacote para a língua portuguesa, a partir do pacote para espanhol. Copie os oito arquivos spa.* para por.*

tjpp@~

/usr/local/share/tessdata/por.DangAmbigs
/usr/local/share/tessdata/por.freq-dawg
/usr/local/share/tessdata/por.inttemp
/usr/local/share/tessdata/por.normproto
/usr/local/share/tessdata/por.pffmtable
/usr/local/share/tessdata/por.unicharset
/usr/local/share/tessdata/por.user-words
/usr/local/share/tessdata/por.word-dawg

Boa parte destes arquivos dizem respeito ao reconhecimento de caracteres, por exemplo, os arquivos eng. não tem informação sobre caracteres acentuados. Como os caracteres na língua portuguesa são um subconjunto dos caracteres espanhóis, podemos usá-los sem grande problemas. O que precisamos é criar dois dicionários (palavras frequentes e outras nem tão frequentes) para uso pelo OCR (que usa palavras como desempate). O arquivo /usr/local/share/tessdata/por.user-words contém palavras próprias de uso frequente por você, mas não por outras pessoas (depende do seu ramo de atividade, por exemplo. O arquivo é ASCII, com uma palavra por linha. Para criar o arquivo de palavras frequentes, não é preciso ser professor de português, basta procurar no Google por “lista palavras frequentes português”. O primeiro resultado te leva à página http://linguateca.di.uminho.pt/Paulo/stopwords/ que contém três arquivos com as 100, 200 e 300 palavras mais usadas e, acreditem, no formato uma palavra por linha. Baixei a de trezentas palavras. Só que o arquivo está em ISO8859-1 e precisamos dele em UTF-8, para depois convertê-lo para o formato do tesseract-OCR. Os comando usados foram

tjpp@~

iconv -f ISO-8859-1 -t UTF-8 folha.MF300.txt > frequentes-utf8.txt
wordlist2dawg frequentes-utf8.txt por.freq-dawg

O comando wordlist2dawg pertence ao pacote do tesseract-OCR que você compilou. Necessitamos de uma lista maior de palavras em português e em formato UTF-8. Eu fiz

tjpp@~

sudo apt-get install wbrazilian
iconv -f ISO-8859-1 -t UTF-8 /usr/share/dict/brazilian > brazilian-utf8
wordlist2dawg brazilian-utf8 por.word-dawg

Copie os dois arquivos por.* para o /usr/local/share/tessdata. Agora você já tem todo o suporte. Para o reconhecimento rode

tjpp@~

tesseract figura.tif texto -l por

Isto vai criar um arquivo texto.txt com o texto reconhecido. No meu teste, o acerto é maior que 99% (errou 10 caracteres em 1124, a grande maioria trocando l por i ou |).

Para quem achou complicado criar o dicionário, eu disponibilizo o arquivo com os oito arquivos para o suporte à nossa língua: tesseract-por.tgz. Descompacte-o na pasta /usr/local/share/tessdata.

A versão atualizada deste arquivo está na área de downloads do tesseract-ocr em http://code.google.com/p/tesseract-ocr/downloads/list .