Computação Gráfica
Prof. Márcio Sarroglia Pinho
Manipulação de Imagens
1.Tipos
de imagens
1.1
Imagens True-Color
Tem-se geralmente 24 bits/pixel
8 bits para cada componente RGB
2^24 cores possíveis para cada ponto : 16.777.216 cores
rgb |
rgb |
rgb |
rgb |
rgb |
rgb |
rgb |
rgb |
rgb |
rgb |
rgb |
rgb |
rgb |
rgb |
rgb |
rgb |
rgb |
rgb |
rgb |
rgb |
rgb |
rgb |
rgb |
rgb |
rgb |
rgb |
rgb |
rgb |
rgb |
rgb |
1.2 Imagens com Palette
A imagem é
separada em duas partes
Palette
rgb |
rgb |
rgb |
rgb |
rgb |
rgb |
rgb |
rgb |
rgb |
rgb |
rgb |
rgb |
rgb |
rgb |
rgb |
rgb |
Imagem
10 |
08 |
06 |
06 |
03 |
10 |
06 |
06 |
06 |
06 |
06 |
06 |
11 |
10 |
05 |
03 |
06 |
03 |
O número de cores diferentes por
imagem é limitado pelo tamanho do Palette
2.
Redução do Número de Cores ou Quantização
Como exibir uma imagem True-Color em um dispositivo com Palette ?
Como exibir uma imagem com palette de 256 cores em um dispositivo de 16 cores ?
Genericamente: Como exibir uma imagem com um M cores diferentes
(M trincas RGB distintas) e um dispositivo capaz de exibir N cores
diferentes sendo N < M ?
Algoritmo
1. Tomar a imagem de entrada e determinar quais as N cores que mais vezes aparecem
2. Criar um palette com estas cores
3. Para cada ponto da imagem de entrada
3.1 Determinar qual das entradas do palette construído mais se parece
com a cor (RGB) do ponto
3.2 Exibir o ponto com a cor obtida
2.1 Cores Parecidas
Para determinar qual dentre duas cores(RGB) é a que mais se parece com
uma terceira basta calcular a distância entre as cores no espaço RGB.
Quanto menor a distância mais pareciadas são Cor 1 e Cor 2
3.
Exibição de imagens em tons de cinza
3.1
Tom de cinza
Uma cor é um tom de cinza sempre que suas componentes R, G e B são
iguais
Preto R:0 G:0 B:0
Branco R:255 G:255 B:255
Cinza R:30 G:30
B:30
Cinza R:200 G:200 B:200
3.2
Grau de luminosidade
O grau de luminosidade de uma cor significa quanto o olho humano pode
perceber desta cor.
Pode ser calculado por
Luminosidade = R*0.3 + G*0.59 + B *0.11
3.2.1
Exibição em dispositivos True-Color
Tomar cada
ponto da imagem e calcular seu grau de luminosidade: K
Exibir o ponto
com um tom de cinza que tenha as componente R,G e B todas iguais a K
3.2.2
Exibição em dispositivos com Palette
1. Montar um palette com N tons de cinza em ordem crescente
Índice |
0 |
... |
50 |
|
100 |
|
255 |
r,g,b |
0,0,0 |
... |
50,50,50 |
... |
100,100,100 |
... |
255,255,255 |
2. Para cada ponto da imagem
Calcular seu grau de luminosidade: K
Exibir o ponto com a cor K do palette
Imagem gerada em tons de cinza
4.
Exibição de Imagens em Dispositivos Monocromáticos
Todos os métodos a seguir apresentados partem de uma imagem em tons de cinza
4.1
Método do Limiar (threshold)
Determina-se
um nível de cinza(limiar) a partir do qual o ponto deve ser aceso
Para cada
ponto da imagem
Se NivelDeCinza > limiar
então acende o ponto
senão apaga o ponto
O limiar pode ser escolhido
como a intensidade média do palette da imagem
Gera uma
imagem de baixa qualidade, entretanto é um algortimo rápido.
4.2
Aproximação por Halftone (Meios-tons)
Cada
intensidade é exibida como um padrão
Para gerar
imagens com 5 tons de cinza usa-se um (padrão 2x2)
Para imagens
com 10 tons de cinza (padrão 3x3)
6 |
8 |
4 |
1 |
0 |
3 |
5 |
2 |
7 |
As imagens geradas com halftone são
sempre maiores que a imagem original
Se uma imagem
possuir mais intensidades que o número de padrões então deve-se criar grupos de
intensidades que serão exibidas com o mesmo padrão:
5 padrões X 50 intensidades
Intensidade |
0..9 |
10..19 |
20..29 |
30..39 |
40..49 |
Padrão |
0 |
1 |
2 |
3 |
4 |
Imagem
gerada por Halftone com padrão 2x2
4.2
Aproximação por Dither
Busca não aumentar o tamanho da imagem
Dn = Matriz de Dither de ordem n
Dn(i,j) = entrada [i,j] da matriz de Dither de ordem n
Para cada ponto (X,Y) da imagem
i = X mod n
j = Y mod n
if (cor(X,Y) > Dn(i,j)
pinta (X,Y)
O problema do Dither é que o padrão
é visível
Para gerar
matrizes de Dither maiores pode-se usar a seguinte técnica
Imagem
gerada pelo método de Dither
(2x2)
4.3
Aproximação por Difusão de erro(Floid-Steinberg)
Parte do
Método do Limiar
Calcula o erro cometido na exibição do pontoDistribui este erro aos pontos vizinhosToma a intensidade média da imagem como valor do limiarSe um ponto tem intensidade maior que o limar
então
acende o pontocalcula o erro cometido na exibiçãoerro = CorPonto - INTENS_MAXSe um ponto tem intensidade menor ou igual ao limiar
então apaga o pontocalcula o erro cometido na exibiçãoerro = CorPonto - INTENS_MINDistribui o erro para os pontos vizinhos (conforme as tabelas)
A imagem deve
ser processada da esquerda para a direita, de cima para baixo.
Este algoritmo
considera que o BRANCO é a intendidade máxima e o PRETO é a mínima.
for(x=1; x< LARG; x++)
for(y=1; y< ALT; y++)
{
if(Cor(x,y) > Limiar)
{
putpixel(x,y,WHITE); // Coloca 255 unidades de cor no ponto
erro = Cor(x,y) - INTENS_MAX; // Erro vai ser NEGATIVO
}
else
{
putpixel(x,y,BLACK); // Coloca ZERO unidades de cor no ponto
erro = Cor(x,y) - INTENS_MIN; // Erro vai ser POSITIVO
}
/* Distribui o erro */
Img[x+1][y] += 3.0/8.0 * erro;
Img[x][y+1] += 3.0/8.0 * erro;
Img[x+1][y+1] += 2.0/8.0 * erro;
}
Imagem gerada por difusão de erro
O algoritmo de
difusão de erro também pode ser usado para exibir imagem em dispositivos com
capacidade de gerar cores
CorPonto = Cor(x,y);
CorExistente = CorMaisParecida(CorPonto);
putpixel(x,y,CorExistente);
erro = CorPonto - CorExistente
/* Distribui o erro ...*/
5. FILTROS
Cada linha de
uma imagem pode ser vista como uma curva que relaciona tempo e freqüência
Os filtros
procuram alterar o comportamento das curvas de freqüência
5.1
Filtros Passa-alta
Trata a curva
mantendo trechos de alfa freqüência e eliminando trechos de baixa freqüência
Usado para
detectar bordas em imagens
Algoritmo
1)Detectar
bordas não horizontais
Para
cada ponto (x,y) de uma linha
Se (Cor(x-1,y) - Cor(x,y)) > limiar
Então Gera um ponto na imagem de saída na posição (x,y)
2)Detectar bordas não verticais
Para
cada ponto (x,y) de uma coluna
Se (Cor(x,y-1) - Cor(x,y)) > limiar
Então Gera um ponto na imagem de saída na posição (x,y)
Observação:
Nestes algoritmos, o cálculo "Cor(x-1,y)- Cor(x,y)" refere-se ao cáculo de uma
distância entre duas cores. Veja
na seção 2.1 como calcular a distância entre duas cores. Também é possivel usar
a diferença de luminosidade entre duas cores apra detectar uma borda.
Imagem gerada por um filtro passa-alta
5.2
Filtros Passa-baixa
Trata a curva
mantendo trechos de baixa freqüência e eliminando trechos de alta freqüência
Usado para
suavizar bordas imagens
Algoritmo
A cor de cada
ponto da imagem passa a ser uma média ponderada entre sua cor original e as
cores dos pontos vizinhos
Em geral,
representam-se os pesos de cada ponto por meio de uma matriz de convolução.
1 |
2 |
1 |
2 |
5 |
2 |
1 |
2 |
1 |
Imagem gerada por filtro passa-baixa
EXERCÍCIOS
Exercício
sobre Impressão de Imagens em Duas Cores.