Desenho de personagem de desenho animado

Descrição gerada automaticamente com confiança baixa

Logotipo

Descrição gerada automaticamente

Ícone

Descrição gerada automaticamente


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)

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 ponto
Distribui este erro aos pontos vizinhos
Toma a intensidade média da imagem como valor do limiar
Se um ponto tem intensidade maior que o limar 
então
   acende o ponto
   calcula o erro cometido na exibição
   erro = CorPonto - INTENS_MAX
Se um ponto tem intensidade menor ou igual ao limiar 
então apaga o ponto
   calcula o erro cometido na exibição
   erro = CorPonto - INTENS_MIN
Distribui 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.

Imagem gerada por filtro passa-baixa

 

EXERCÍCIOS

Exercício sobre Impressão de Imagens em Duas Cores.