~~META: date create = 2007-08-02 &date modified = 2007-08-02 ~~ ====== 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 [[http://jocr.sourceforge.net/|gocr]] e o [[http://www.gnu.org/software/ocrad/ocrad.html|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 ) : {{ blog:entradas:ocr1.png |}} 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): {{ blog:entradas:ocr2.png |}} 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) {{ blog:entradas:ocr3.png |}} 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: {{ blog:entradas:ocr4.png | }} Salve o arquivo como .png, por exemplo (o programa de reconhecimento só trabalha com tiff, mas achei melhor convertê-los pelo ImageMagick): convert figura.png figura.tif Agora vamos compilar o [[http://code.google.com/p/tesseract-ocr/|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 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.*'' /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 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 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 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: {{blog:entradas: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]] . {{tag>debian gimp linux}} ~~LINKBACK:off~~ ~~DISCUSSION~~