domingo, 31 de março de 2013

Problema de Lógica: A balança com defeito

Francisco e sua irmã Ana estão com seu cachorro Simba na farmácia de seu tio. Na farmácia há uma balança com defeito que só mostra corretamente os pesos superiores a 50 kg. Para evitar o defeito, pesaram-se juntos dois a dois e obtiveram os seguintes pesos:

Francisco e Simba pesam juntos 88 kg;
Francisco e Ana pesam juntos 114 kg;
Ana e Simba pesam juntos 60 kg.

Qual é o peso de Francisco, de Ana e do cachorro Simba?





RESPOSTA





De acordo com o enunciado, os valores obtidos nas pesagens de Francisco (x), Ana (y) e Simba (z), dois a dois, foram:

A) x + z = 88
B) x + y = 114
C) y + z = 60

Fazendo A - B, teremos:

D) (x + y) - (x + z) = 114 - 88
D) x + y - x - z = 26
D) y - z = 26

Fazendo C - D, teremos:

E) (y + z) - (y - z) = 60 - 26
E) y + z - y + z = 34
E) z = 17

Fazendo A - E, teremos:

(x + z) - z = 88 - 17
x = 71

Fazendo C - E, teremos:

(y + z) - z = 60 - 17
y = 43

Portanto, Francisco pesa 71 kg, Ana pesa 43 kg e Simba pesa 17 kg.

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!

sábado, 2 de março de 2013

Pausa em shell script

A execução de um script no interpretador de comandos do Linux (este artigo adotando o Bash) pode ser pausada por meio de dois artifícios. Um é o comando interno "read" e o outro é o comando "sleep". O "read" pode ser utilizado para esperar o pressionamento de uma tecla e o "sleep" para que espere por determinado tempo.

A seguinte linha, em determinado ponto do script, faz uma pausa na execução, neste ponto, e deixa o script esperando o pressionamento da tecla Enter:

read -p "Pressione [Enter] para continuar ou CTRL+C para sair..."

Como CTRL+C interrompe a execução do script, pode-se aproveitar para informar esta possibilidade.

Se desejar uma pausa controlada por tempo, a seguinte linha em determinado ponto do script faz uma pausa na execução por, no caso, 5 segundos:

sleep 5

O padrão para o "sleep" é em segundos mas pode-se adicionar o sufixo m para minutos, h para horas ou d para dias.

Os dígitos verificadores do CPF/CNPJ

O CPF (Cadastro de Pessoa Física) e o CNPJ (Cadastro Nacional da Pessoa Jurídica) são cadastros para identificar uma pessoa perante a Receita Federal do Brasil. O CPF possui um número com 9 dígitos, denominado raiz, e o CNPJ possui um número com 12 dígitos, raiz mais sufixo. Estes números, são complementados por dígitos verificadores (DV), totalizando 11 dígitos no CPF e 14 dígitos no CNPJ. Estes dígitos verificadores servem para conferir a integridade e autenticidade do número, evitando erros de digitação, números falsos etc. O número do CPF tem o formato xxx.xxx.xxx-vv e o número do CNPJ tem o formato xx.xxx.xxx/xxxx-vv, os dígitos verificadores são os dois últimos, nos dois cadastros.

Cada dígito verificador é calculado separadamente e o primeiro entra no cálculo do segundo. O algoritmo do cálculo é denominado Módulo 11, cada dígito verificador é gerado pelo resto da divisão por 11, e o que é dividido é o somatório dos dígitos do número e seus respectivos pesos.

Os dígitos dos números do CPF e CNPJ recebem pesos antes de serem somados. Para o CPF o peso é crescente em uma unidade de 2 em diante, até a quantidade de dígitos. Para o CNPJ o peso também é crescente em uma unidade de 2 em diante mas até 9, retornando a 2 e repetindo a sequência até a quantidade de dígitos. Esta quantidade de dígitos é ampliada no cálculo do segundo DV pois o primeiro DV entra como parte do número raiz do CPF e CNPJ.

CPF:
Pesos do 1º DV: 2, 3, 4, 5, 6, 7, 8, 9, 10      (para os 9 dígitos do número)
Pesos do 2º DV: 2, 3, 4, 5, 6, 7, 8, 9, 10, 11  (para os 9 dígitos do número mais o 1º DV)

CNPJ:
Pesos do 1º DV: 2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5     (para os 12 dígitos do número)
Pesos do 2º DV: 2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5, 6  (para os 12 dígitos do número mais o 1º DV)

Os dígitos dos números recebem os pesos na ordem do menos significativo ao mais significativo, isto é, da direita para a esquerda. Então a sequência dos pesos fica invertida. Cada dígito é multiplicado ao seu respectivo peso. Os produtos são somados e então divididos por 11.

Cada dígito verificador é gerado a partir do resto desta divisão por 11. Se o resto for 0 ou 1 o dígito verificador será 0, se o resto for maior que 1 o dígito verificador será a subtração de 11 pelo resto. Esta regra é a mesma tanto no CPF como no CNPJ, o que mudam são somente os pesos.

Os exemplos a seguir mostram os cálculos dos dígitos verificadores de um número CPF e de um número CNPJ. Perceba que o primeiro peso da sequência vai para o dígito mais à direita. No cálculo do 1º DV este dígito mais à direita (menos significativo) é a unidade do número raiz no caso do CPF e a unidade do sufixo no caso do CNPJ. Já no cálculo do 2º DV o primeiro peso vai para o 1º DV, que entrou no número à direita:


CPF nº 147.258.369

(1x10)+(4x9)+(7x8)+(2x7)+(5x6)+(8x5)+(3x4)+(6x3)+(9x2)
   10 +  36 +  56 +  14 +  30 +  40 +  12 +  18 +  18  =  234

O resto da divisão de 234 por 11 é 3, portanto o 1º DV é 11-3, que é igual a 8. O CPF fica, por enquanto:

CPF nº 147.258.369-8

(1x11)+(4x10)+(7x9)+(2x8)+(5x7)+(8x6)+(3x5)+(6x4)+(9x3)+(8x2)
  11  +  40  +  63 +  16 +  35 +  48 +  15 +  24 +  27 +  16  =  295

O resto da divisão de 295 por 11 é 9, portanto o 2º DV é 11-9, que é igual a 2. O CPF completo é 147.258.369-82.


CNPJ nº 14.725.836/0001

(1x5)+(4x4)+(7x3)+(2x2)+(5x9)+(8x8)+(3x7)+(6x6)+(0x5)+(0x4)+(0x3)+(1x2)
  5  +  16 +  21 +  4  +  45 +  64 +  21 +  36 +  0  +  0  +  0  +  2  =  214

O resto da divisão de 214 por 11 é 5, portanto o 1º DV é 11-5, que é igual a 6. O CNPJ fica, por enquanto:

CNPJ nº 14.725.836/0001-6

(1x6)+(4x5)+(7x4)+(2x3)+(5x2)+(8x9)+(3x8)+(6x7)+(0x6)+(0x5)+(0x4)+(1x3)+(6x2)
  6  +  20 +  28 +  6  +  10 +  72 +  24 +  42 +  0  +  0  +  0  +  3  +  12 =  223

O resto da divisão de 223 por 11 é 3, portanto o 2º DV é 11-3, que é igual a 8. O CNPJ completo é 14.725.836/0001-68.


Estes cálculos são frequentemente utilizados em sistemas computacionais para testar a veracidade dos números. Impede erros de digitação e detecta números falsos caso alguém queira inventar um número mentalmente. Obviamente, é possível inventar fazendo todos os cálculos para os dígitos verificadores, no entanto, as pessoas normais precisam de pelo menos um lápis e um papel para isso.

Observações: Nos números de CNPJ emitidos antes de 1993 (nesta época ainda era chamado CGC), o 8º dígito (o menos significativo) é um DV módulo 10 dos sete dígitos anteriores. A partir de 1993 o CNPJ não foi mais gerado assim. Os números de CPF e CNPJ usados nos exemplos deste artigo foram inventados por mim, pela posição das teclas em meu teclado. Se estes números estão sendo utilizados por alguém, esta pessoa é sortuda, possui uma sequência de teclas.