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 .

Discussão

James CogganJames Coggan, 03/Aug/2007 23:48

Sera que existe algum programa (ou dois) em modo texto que faz essa desfocagem e limpeza do arquivo? Valeu

Thadeu PennaThadeu Penna, 04/Aug/2007 10:41

Grande jogada: o modo texto é mais eficiente para conversões de grandes quantidades de páginas. Eu recomendaria usar o Gimp até achar os parâmetros ideiais. Uma saída seria usar o scripting do Gimp (Script-Fu) para realizar as operações em linha de comando, mas eu descobri outra mais rápida: o imagemagick. Fiz os testes aqui para descobrir como converter os parâmetros de um para o outro. O Threshold/Limite do Gimp é o -black-threshold do convert. No Gimp, os valores variam de 1 a 255. No ImageMagick vai de 0 a 100%. O outro é o -blur, cujo o default do Gimp é sigma=2. Assim fiz o seguinte:

$ convert -black-threshold 86% ocr1.png ocr2.png
$ convert -blur 3×2 ocr2.png ocr3.png
$ convert -black-threshold 50% ocr3.png ocr4.png

O resultado é idêntico…

ValdomiroValdomiro, 15/Aug/2007 17:17

Tadeu,

Valeu pelo tudo. Segui o passo-a-passo e deu tudo certo. Depois só para comparar usei o Kooka que faz uso do gocr e do ocrad, e realmente a diferença é bem perceptível.

Grato.

Serena PereiraSerena Pereira, 17/Aug/2007 09:50

Simplesmente excelente esta dica!

Tesseract-OCR instalado da forma como é sugerido pelo Thadeu Penna, para gerar um melhor resultado no reconhecimento dos textos em português, destrói a idéia de não ser possível fazer, no Linux, OCR com qualidade.

Colaborarei com o projeto, e parabenizo ao autor da dica.

caio1982caio1982, 22/Nov/2007 11:05

Tadeu, você sabe me dizer em que nível o Tesseract-OCR já esta pra chars não padrões? Por exemplo, eu estudo Linguística e gostaria muito de poder usá-lo com símbolos fonéticos do IPA: http://en.wikipedia.org/wiki/International_Phonetic_Alphabet

Tem alguma idéia ou sugestão de referência do Tesseract-OCR pra eu pesquisar?

Thadeu PennaThadeu Penna, 22/Nov/2007 19:15

Oi Caio,

sim, o Tesseract é bastante usado pelos indianos (e seus vários alfabetos), por exemplo. Se me recordo bem, existem dificuldades com o Arábico e outras escritas do tipo esquerda-para-direita. Como não é o seu caso, você pode treinar o Tesseract como uma nova linguagem, já que não creio que vá reconhecer frases ou parágrafos inteiros. O manual de treinamento está em http://code.google.com/p/tesseract-ocr/wiki/TrainingTesseract.

Outra dica que pode ser valiosa para você, caso você use o LaTeX com os símbolos fonéticos é a discussão neste link http://groups.google.com/group/tesseract-ocr/browse_thread/thread/ea3c0ba4bc81f9ab/f8115d08a64b1a15?#. O pessoal usa o LaTeX para treinar o tesseract em vietnamês (???) e kannada (indiano).

Boa sorte e , por favor, me mantenha informado dos seus resultados.

Manoel NascimentoManoel Nascimento, 14/Feb/2008 16:30

Olá, tenho encontrado um problema chato no Tesseract que é o seguinte:

Unable to load unicharset file /usr/local/share/tessdata/eng.unicharset

Ficaria muito grato se você pudesse me indicar uma solução.

Thadeu PennaThadeu Penna, 14/Feb/2008 16:34

Oi Manoel

como comentei no post acima, pode ser que o diretório não tenha permissão de leitura. Use o comando sudo chmod -R a+r /usr/local/share/tessdata/

para mudar as permissões. Caso o erro persista, pode se rque você não tenha baixado o pacote de línguas, o arquivo solicitado é exatamente o conjunto para inglês.

Pedro PisandelliPedro Pisandelli, 16/Feb/2010 19:24

Cara, usei o Tesseract mas simplesmente ele não reconhece nem 0,1% dos caracteres… está trazendo seqüências de caracteres estranhos… Uso ele com o gscan2pdf. O que poderia estar acontecendo. Meus pais precisam usar um software OCR no PC e estão ficando irritados por não conseguirem. Não vou instalar o windows por conta de um OCR. Estou usando UBUNTU 9.10 com o tesseract; tesseract-por e o GOCR instalado. Por favor, responda por email, se possível.

Obrigado e parabéns pelo projeto

Manoel NascimentoManoel Nascimento, 07/May/2008 06:59

Olá! Na verdade o que havia acontecido foi um erro na instalação, o “tar.gz” que baixei havia sido corrompido. Baixei outro, reinstalei o Tesseract e ele funciona maravilhosamente bem. Só falta agora eu aprender a melhorar as imagens para digitalização, pois o material com o qual trabalho são jornais antigos, e isso dá muito trabalho para qualquer programa de reconhecimento ótico ler sem gerar ruído. Muito obrigado!

Francisco NoraFrancisco Nora, 02/Jul/2008 15:26

Gostaria de conversar sobre OCR. Você quem escreveu o descritivo acima ? Pode me contatar ? Grato

Israel PestilhoIsrael Pestilho, 23/Jul/2008 12:03

Muito bom artigo amigo… gostaria de dizer que estou animado em compilar uma versão do tesseract para windows… tive testando sua eficiencia, e notei que ele supera muitos ocr's que tem pra windows… acredito que ele faria um sucesso legal pra windows

Lucas De Castro BorgesLucas De Castro Borges, 16/Sep/2008 01:24

Cara …. achei legal .

pena que meu Arch Linux não suporta a Scanner que tenho .

minha é scanner é uma HP

Edson Gonçalves JuniorEdson Gonçalves Junior, 25/Sep/2008 22:18

Muito obrigado. Estou com um trabalho enorme para fazer e agora vou poder agilizar bastante. Acabei de copilar o Tesseract e vou usá-lo agora mesmo. Muito agradecido.

Edson Gonçalves JuniorEdson Gonçalves Junior, 25/Sep/2008 23:24

Como abre o programa Tesseract? Eu já compilei, mas não acho o executável. Como faço Thadeu Penna?

Thadeu PennaThadeu Penna, 25/Sep/2008 23:34

Oi Edson,

este artigo não é o mais atual. Veja este outro que torna as coisas muito mais fáceis: OCR de qualidade no Linux: agora é fácil

Edson Gonçalves JuniorEdson Gonçalves Junior, 26/Sep/2008 01:55

Não consigo usar os programas que copilei. Nem o Tesseract, e nem o Gscan2pdf. O primeiro nem sei onde esta o executável. Não sei o que pode ter dado errado. Alguém me ajuda?

williamwilliam, 31/May/2009 12:13

parabéns pelo excelente trabalho!!!

AndreDuraoAndreDurao, 20/Aug/2009 09:07

obrigado pelo post, muito bom.

markinmarkin, 22/Oct/2009 15:52

cara… para ser sincero… testei varias palavras… ele não acertou nenhuma… :/ sabe o que pode ser? Ainda tem palavras que ele não escreve nada no arquivo de texto. Se puder entrar em contato comigo por e-mail eu agradeceria, estou fazendo um script em shell bash e preciso de uma ajuda com ele…

obrigado por enquanto!

Abraços!

Rafael Gustavo GassnerRafael Gustavo Gassner, 29/Mar/2010 22:25

Testei todos os citados neste post, mas acabei ficando com o YAGF, que é um frontend para o cuneiform. Simplesmente perfeito! Pouquíssimos erros.

http://symmetrica.net/cuneiform-linux/yagf-en.html

TiagoTiago, 27/Aug/2010 20:17

O meu conselho é este: Instalem o adobe acrobat pro extended, pelo wine! Sem comparação com os restantes programas…

LuizLuiz, 15/Oct/2011 13:58

Nunca encontrei programas de ocr para Linux como exitems para MS. Por exemplo, quem conhece o ABBYY sabe que ele é simplesmente imbatível. Para quem não conhece e só para ter uma idéia, ele ecaneia uma pagina de jornal ou revista, identifica o texto, recorta e separa as imagens, remonta a página em doc e ainda, no idioma em que estiver, faz a correção e sugestão de correção gramatical. Para quem depende muito destes recursos diariamente, vale a pena o preço.

CleberCleber, 22/Nov/2011 23:30

Thadeu,

Boa noite.

O que eu fiz de errado? Tentei com uma imagem .jpg e não funcionou, usei o Gimp e passei para .tif. Mesmo assim não funcionou.

root@cleberv-ubutun:/home/cleberv# ls Documentos/ Imagens tesseract-por.tgz teste2.jpg teste.jpg teste.odt teste.tif teste.txt Thumbs.db root@cleberv-ubutun:/home/cleberv# tesseract /cleberv/home/Documentos/teste.jpg /cleberv/home/Documentos/teste.txt -l por Tesseract Open Source OCR Engine name_to_image_type:Error:Unrecognized image type:/cleberv/home/Documentos/teste.jpg IMAGE::read_header:Error:Can't read this image type:/cleberv/home/Documentos/teste.jpg tesseract:Error:Read of file failed:/cleberv/home/Documentos/teste.jpg Falha de segmentação root@cleberv-ubutun:/home/cleberv# tesseract /cleberv/home/Documentos/teste.tif /cleberv/home/Documentos/teste.txt -l por Tesseract Open Source OCR Engine TIFFOpen: /cleberv/home/Documentos/teste.tif: Cannot open. tesseract:Error:Read of file failed:/cleberv/home/Documentos/teste.tif Falha de segmentação root@cleberv-ubutun:/home/cleberv#

CleberCleber, 22/Nov/2011 23:57

ops… desculpe eu coloquei o caminho errado.

Funcionou, mas o índice de acerto foi muito baixo, creio que a causa foi o tipo de imagem que está colorida.

São centenas de imagens que eu terei que processar, existe como 'treinar' o programa ou configurar o dicionário para melhorar o índice de acerto?

Não funcionou com jpg, mas o OCRfeeder funciona com arquivos jpg. E o OCRfeeder usa o tesseract.

t+

Murilo IjancMurilo Ijanc, 22/Dec/2011 16:11

Olá bem ineterssante o posto, estou tendo um problema com a instalação da linguagem quando descompacto o arquivo ele só tem um único arquivo chamado por.trainedata como eu uso esse arquivo como você citou acima?

Abraços

júlio césar correia filhojúlio césar correia filho, 28/Dec/2011 19:51

seja simples isso ai não resolve nada no windows eu faço o download e clico em executar e pronto é mais direto que esse monte de comandos

Enter your comment
GBJZV
 
blog/entradas/ocr-de-qualidade-no-linux.txt · Última modificação: 27/Mar/2010 23:52 (edição externa)
chimeric.de = chi`s home Creative Commons License Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0