5.2 Escala de Cinzas
Em alguns momentos é mais conveniente trabalharmos com valores em escala de cinzas. Isto se deve, principalmente porque eliminamos a necessidade de utilizar uma dimensão adicional para armazenar as cores. Uma imagem utilizando uma escala de cores RGB tipicamente é processada utilizando f(x,y,c) onde (x,y) são as componentes espaciais e c é a componente de cor, normalmente com tamanho 3 representando as três componentes do sistema RGB.
O modo mais simples de converter uma imagem nessa escala para a escala de níveis de cinzas é utilizando a média dos três canais de cores: Sendo assim, a nova intensidade seria:
= (imagem_colorida[:,:,0] + imagem_colorida[:,:,1] + imagem_colorida[:,:,2])/3 imagem_cinza
Porém, essa conversão não é a mais adequada. O olho humano possui uma sensibilidade diferente as componentes de cores. Para uma conversão mais representativa ao olho humano, utilizamos pesos diferentes para cada canal de cor. Sendo assim, a forma mais adequada de conversão utiliza os valores abaixo:
#considerando imagem float e formato RGB
= (0.2126*imagem_colorida[:,:,0] + 0.7152*imagem_colorida[:,:,1] + 0.0722*imagem_colorida[:,:,2]) imagem_linear

Figura 5.3: Conversão para escala de cinzas. Conversão utilizando a média (imagem superior) e os coeficientes adequados (imagem inferior).
A diferença entre os dois modos pode ser vista acima. Embora sútil neste exemplo, essa diferença pode fazer ser bastante expressiva em imagens com intensidades de cores tendendo aos tons azuis.
Outra forma de reconstrução é o chamado dithering, que em termos gerais, refere-se ao processo de redução do número de cores em uma imagem.
Também chamado de pontilhamento, o dithering é necessário algumas vezes para exibição em equipamentos com um número limitado de cores ou para impressão. um exemplo são os leitores de livros eletrônicos, chamados e-ink.
Jornais também costumar ter um número reduzido de cores, normalmente apenas duas cores da escalas de cinza: preto e branco.
Representar uma imagem com apenas dois tons também é conhecido como meio-tom. Para quantização a 2 tons de cinza, podemos comparar a imagem com uma matriz aleatória r. O truque é criar uma matriz adequada para que as escalas de cinza sejam representadas uniformemente no resultado.
Por exemplo, uma área contendo um nível de cinza intermediário (cerca de 127) terão um padrão quadriculado; uma área mais escura terá um padrão contendo mais preto do que branco, e uma área clara terá um padrão contendo mais branco do que preto.
Uma matriz padrão que pode ser utilizada é essa:
D=[012819264]
Essa matriz deve ser repetida horizontal e verticalmente até que se obtenha uma matriz com o tamanho adequado, por exemplo, para uma imagem de tamanho 6×6: D´=[012801280128192641926419264012801280128192641926419264012801280128192641926419264]
Uma forma de se gerar o pontilhamento em duas cores consiste em comparar os valores dos pixels com a matriz D. Caso o valor seja maior que a intensidade do pixel, então atribuir o valor 1, caso contrário 0.
Figura 5.4: Dithering utilizando apenas dois valores na escala de cinza.
O resultado dessa operação pode mudar drasticamente de acordo com os valores utilizados na Matriz D,
Utilizando os conceitos vistos nesta seção, implemente a operação de dithering utilizando dois tons na escala de cinza.
Utilize a matriz dada acima como exemplo:
D1=[012819264]
Utilize também a seguinte matriz, e compare os resultados obtidos:
D2=[0128321601926422496481761614424011220880]
- Dica: Utilize a função
np.tile
para repetir as matrizes D1 e D2 . - Dica: você pode comparar duas matriz utilizando o numpy. Por exemplo, basta utilizar M1>M2 onde Mi são matrizes (
np.arrays
com dimensão dois).