Mostrando postagens com marcador caractere. Mostrar todas as postagens
Mostrando postagens com marcador caractere. Mostrar todas as postagens

domingo, 3 de março de 2013

Ajustar níveis de cor no tratamento de texto digitalizado

Um texto impresso em papel e digitalizado para um arquivo de imagem pode conter diversas interferências, que comprometam a qualidade da cópia digital. Desconsiderando o desempenho do dispositivo de digitalização (scanner), o próprio impresso pode dificultar uma boa digitalização. A cor do papel, o tipo do papel, a qualidade da impressão e até a gramatura que, quando pequena deixa o papel um pouco transparente e assim a impressão do verso torna-se levemente visível na frente. Tudo isso influencia no resultado final.

Quase sempre é preciso fazer alguma correção na imagem do texto digitalizado. Felizmente temos os softwares de tratamento de imagens, que não são somente para fotografias pois são capazes também de tratar desenhos e textos digitalizados.

Este artigo mostra uma ferramenta de cor, a ferramenta de níveis de cor, que realiza um tratamento muito bom para este tipo de imagem digitalizada. O software utilizado na demonstração desta ferramenta é o GIMP (www.gimp.org), um software gratuito com muitos recursos e disponível para Linux e Windows.

O texto é basicamente uma imagem de duas cores, a cor do fundo, que é a cor do papel, e a cor do texto, que é a cor da tinta da impressão. Apenas ajustando os níveis podemos modificar os pixels para que eles se concentrem no preto e no branco. Poderíamos converter a imagem para a paleta preto e branco de 1 bit mas nisso perderia-se a suavidade dos caracteres, ou usar a ferramenta de contraste mas esta não permite um controle preciso no nível da cor preta e da cor branca.

A ferramenta de níveis de cor proporciona uma funcionalidade semelhante a ferramenta de histograma, entretanto, pode alterar o alcance da intensidade, tornar a imagem mais clara ou mais escura, alterar o contraste e corrigir a cor predominante. No GIMP, a ferramenta de ajuste de níveis de cor está acessível pelo menu "Cores/Níveis..." (Colors/Levels).

Vamos iniciar o nosso exemplo com esta imagem de um texto digitalizado. Veja que a cor dos caracteres está fraca, o papel está acinzentado e é possível perceber a impressão do verso:


Imagem digitalizada original

Abrindo a janela da ferramenta de ajuste de níveis de cor vemos o histograma linear na imagem, nos níveis de entrada. O histograma mostra a quantidade de pixels em cada nível de cor. O eixo horizontal vai do nível 0 (preto) ao nível 255 (branco) e a quantidade de pixels por nível está no eixo vertical. A área da curva representa todos os pixels da imagem.

No histograma desta imagem original vemos dois picos, o da esquerda é referente aos pixels próximos do preto e o da direita é referente aos pixels próximos do branco. Perceba que a quantidade de pixels próximos do branco é bem maior pois a área livre (sem impressão) do papel é predominante. Os pixels próximos do preto são os caracteres. Abaixo este histograma original:


Histograma da imagem original

Não mostrarei todas as funcionalidades desta ferramenta de níveis, apenas os ajustes dos níveis de entrada, que são suficientes para o propósito deste artigo. No combo do canal deixe em "Valor", significa todos os canais.

Os níveis de entrada são ajustados pelos três triângulos deslizantes, ou pelos conta-gotas (desnecessário neste artigo), ou pelas três caixas de valor numérico. São três pontos porque o da esquerda seleciona o ponto negro, o da direita seleciona o ponto branco e o do centro ajusta o gama, o ponto médio.

Reposicionando o ponto negro faz com que todos os pixels, que possuírem este valor ou menos, tornem-se pretos. Assim, vamos posicioná-lo para alcançar todos os pixels referentes aos caracteres. Abaixo o histograma ajustado no ponto negro e a imagem digitalizada após este ajuste:


Histograma com ajuste do ponto negro


Imagem resultante

Podemos ver que os caracteres estão quase que totalmente pretos.

Reposicionando o ponto branco faz com que todos os pixels, que possuírem este valor ou mais, tornem-se brancos. Assim, vamos posicioná-los para alcançar todos os pixels referentes ao papel. Abaixo o histograma ajustado no ponto branco e a imagem digitalizada após este ajuste:


Histograma com ajuste do ponto branco


Imagem resultante

Podemos ver que o papel está completamente branco.

O que foi feito até agora foi o ajuste isolado de cada ponto, para mostrar o seu respectivo efeito. O tratamento final da imagem digitalizada está no reposicionando dos dois pontos, o negro e o branco, fazendo o ajuste em conjunto. Abaixo o histograma ajustado no ponto negro e no ponto branco e a imagem após este ajuste. Temos agora a imagem final:


Histograma com ajustes de ambos os pontos


Imagem resultante final

O texto está bem mais nítido, com o contraste adequado e o papel (fundo) sem qualquer sujeira. Volte lá na imagem original e compare com esta. Agora perfeito, não? A ferramenta de ajustes dos níveis de cor é mais eficiente em eliminar as sujeiras no papel. As vezes, existem pontos que são escuros o suficiente para confundir com os caracteres e esta ferramenta possibilita distanciá-los do preto e aproximá-los do branco.

O reposicionamento do ponto médio pode ser feito se desejar alterar o gama. Indo para a esquerda, para o preto, a imagem fica mais clara, indo para a direita, para o branco, a imagem fica mais escura. Nestes exemplos estou mantendo no 1 para evidenciar o efeito dos outros níveis.

Apenas com este ajuste dos níveis de cor podemos obter uma imagem, de um texto digitalizado, muito mais agradável para leitura. Inclusive, facilita o reconhecimento ótico dos caracteres (OCR), caso o propósito da imagem seja para este procedimento, o software não sofrerá com as interferências. Boas digitalizações!

quinta-feira, 21 de julho de 2011

Caracteres especiais na variável de ambiente do proxy

No ambiente do interpretador de comandos do Linux existem variáveis de ambiente que servem para armazenar o endereço do servidor proxy e assim os programas clientes, compatíveis com este recurso, as utilizam como parâmetros de configuração.

No Bash e similares existem as variáveis http_proxy, ftp_proxy, gopher_proxy, wais_proxy e no_proxy. Cada variável serve para determinado protocolo e a variável no_proxy especifica um conjunto de domínios, separados por vírgulas, para onde o proxy não será consultado.

A atribuição de valores para estas variáveis de ambiente por ser feita pelo comando "export http_proxy="http://endereço:porta" ou, se necessitar de autenticação, "export http_proxy="http://usuário:senha@endereço:porta", executado diretamente no prompt do shell ou pelo "/etc/profile" etc.

Nos casos de proxy com autenticação de usuário e senha pode acontecer de existirem caracteres especiais, principalmente na senha, e nestes casos, para que o shell interprete corretamente os valores, pode ser necessário usar os códigos de escape nestes caracteres. Trata-se da codificação por cento para caracteres de escape em URL (http://dan-scientia.blogspot.com/2010/05/codificacao-por-cento-para-caracteres.html).

Por exemplo, uma senha definida como 12@elo/6.c deve ser informada na declaração da variável na forma 12%40elo%2F6%2Ec, assim não haverá problemas na interpretação pelo shell.

quinta-feira, 13 de maio de 2010

Codificação por cento para caracteres de escape em URL

O mecanismo de codificação por cento é utilizado para representar um octeto de dados em um componente, quando o caractere correspondente à este octeto está fora do conjunto permitido ou está sendo usado como um delimitador ou no interior do componente. O octeto em codificação por cento é representado em um caractere terceto, que consiste em um símbolo de porcentagem "%" seguido de dois dígitos hexadecimais, insensível à maiúsculas e minúsculas, que representam o valor numérico do octeto. Por exemplo, "%20" é a codificação por cento para o octeto binário "00100000", que corresponde ao caractere de "espaço" na tabela US-ASCII.

No Localizador-Padrão de Recursos (URL, Uniform Resource Locator), ou seja, em um endereço na Internet a codificação por cento é utilizada para prevenir a má interpretação dos caracteres especiais, como espaços, parêntesis e outros símbolos. O navegador Web analisa o endereço de localização e codifica/decodifica os caracteres especiais para que tudo funcione adequadamente.

O uso da codificação por cento é necessária nos casos de caracteres não imprimíveis, caracteres fora do padrão ASCII, caracteres reservados à sintaxe de uma URL ("$", "&", "+", ",", "/", ":", ";", "=", "?", "@") e caracteres inseguros que podem enganar uma URL (espaço, "<", ">", "#", "%", "{", "}", "|", "\", "^", "~", "[", "]", "`").

Tabela de caracteres de escape em URL:

Caractere    Codificação     Caractere     Codificação

espaço          %20             #             %23
$               %24             %             %25
&               %26             @             %40
`               %60             /             %2F
:               %3A             ;             %3B
<               %3C             =             %3D
>               %3E             ?             %3F
[               %5B             \             %5C
]               %5D             ^             %5E
{               %7B             |             %7C
}               %7D             ~             %7E
+               %2B             ,             %2C

Uma boa prática para o desenvolvedor na Internet é evitar o uso dos caracteres de escape na formulação de uma URL para os nomes de diretórios e arquivos. É recomendável também usar o hífen "-" ao invés do sublinhado "_" em uma URL pois alguns navegadores antigos não interpretam corretamente o sublinhado no CSS. Vale lembrar que a codificação por cento destes caracteres são diferentes da codificação dos caracteres especiais na linguagem HTML.

terça-feira, 16 de março de 2010

Converter a codificação de caracteres de um arquivo texto

No Linux existe um comando chamado "iconv", do pacote "glibc-common" (no Fedora é este pacote, em outras distros pode ser outro), que serve para converter a codificação de caracteres de um arquivo texto de um padrão para outro.

Executando o comando com o parâmetro "--list", retorna-se a lista com todas as codificações suportadas e aceitas nos parâmetros "--from-code=" e "--to-code=" (ou -f e -t respectivamente). O arquivo de saída é definido no parâmetro "--output", ou "-o". Por exemplo:

$ iconv --from-code=UTF-8 --to-code=ISO-8859-1 utf.txt -o iso.txt

Caso queira descobrir em qual codificação de caracteres está o arquivo texto use o comando "file", do pacote de mesmo nome, com o parâmetro "-i". Por exemplo:

$ file -i arquivo.txt

Consulte as páginas manuais destes dois comandos para mais informações.

quarta-feira, 22 de julho de 2009

A história do fim de linha

O ASCII (American Standard Code for Information Interchange), é uma codificação de caracteres de sete bits baseada no alfabeto inglês. Os códigos ASCII representam texto nos computadores, equipamentos de comunicação e outros dispositivos que trabalhem com texto.

A codificação define 128 caracteres, preenchendo completamente os sete bits disponíveis. Desses, 32 são caracteres de controle e não são imprimíveis, afetam somente o processamento do texto. Do restante, 94 são caracteres imprimíveis, com o espaço considerado um gráfico invisível, e há também um caractere sonoro, que apenas emite um bip ou faz piscar a tela.

Os caracteres de controle foram criados para algumas funções como o controle da impressora e da exibição na tela do monitor, estrutura de dados, controle de transmissão e outros.

Nossa história vai tratar de dois deles, o Line feed (LF) e o Carriage return (CR). O Line feed é um caractere de controle que alimenta uma nova linha no texto, ou seja, adiciona uma nova linha a partir do cursor. O Carriage return faz o retorno de carro, traz o cursor para o começo da linha. Estes caracteres são usados para marcar o fim-de-linha (EOL) em um texto.

A seqüência CR+LF era de uso comum em vários computadores que usavam máquinas teletipo como console, pois esta seqüência era necessária para posicionar a cabeça de impressão no começo de uma nova linha. O uso de dois caracteres devia-se ao fato de que os teletipos não eram rápidos o suficiente para retornar à margem esquerda em tempo hábil para apenas um caractere, assim o CR vinha em primeiro lugar. Mesmo os teletipos se tornando obsoletos, os programas criados para eles mantiveram esta seqüência de dois caracteres.

Deste modo o padrão ASCII para texto não define um único caractere para fim-de-linha. Em vez disso o padrão ASCII define dois movimentos independentes da cabeça de impressão: retorno de carro e incremento de linha.

No entanto os desenvolvedores dos sistemas operacionais modernos, por sua vez, adotaram convenções diferentes para o fim-de-linha, uns usaram LF, outros usaram CR e alguns outros usaram CR+LF:

Unix, Linux e Mac OS X: LF (Line feed, 0x0A, 10 em decimal)
Mac OS até versão 9: CR (Carriage return, 0x0D, 13 em decimal)
DOS/Windows: CR seguido de LF (CR+LF, 0x0D 0x0A)

Por exemplo, arquivos criados no Unix ou no Mac serão vistos como uma longa e única linha no Windows. Analogamente, um arquivo do Windows visto no Unix terá seus CR mostrados como um ^M ao final de cada linha ou como um segundo pula linha.

Este tipo de diferença pode ocasionar problemas quando um arquivo texto for lido em um outro sistema. Um compilador poderá falhar com erros de sintaxe obscuros, um script poderá falhar em sua execução ou um erro de leitura poderá acontecer quando um utilitário despreparado for abri-lo.

Os editores de textos mais recentes reconhecem todas as variações de fim-de-linha do tipo CR e LF, tratando adequadamente o texto, inclusive permitindo ao usuário converter entre os diferentes padrões. Infelizmente isto não vale para o editor padrão do Windows, o Bloco de notas, mas vale para o Wordpad e vale também para muitos editores do Linux.

Além dos editores de texto modernos existem os comandos dos2unix e unix2dos, no ambiente Linux, que podem ser usados para converter entre o CR+LF (DOS/Windows) e o LF (Unix).

Quem trabalha com arquivos de texto puro entre sistemas diferentes deve ficar atento quanto à estes caracteres de controle.