Você está na página 1de 83

Prof Kesede R Julio

Prof Kesede R Julio


kesedejulio@gmail.com

A postila de

C omputação G ráfica

P rocessamento de magem I

Campinas – SP - Brasil

Computação Gráfica e Processamento de Imagem 1


Prof Kesede R Julio

Índice
Capítulo 1.Introdução..............................................................................................................3
1.1.Breve Histórico 3
1.2.Contextualização 7
1.3Aplicações 7
1.4Dispositivos Gráficos 8
1.5Resolução Gráfica 9
1.6Sistemas de Coordenadas 10
1.1Exercícios 11
Capítulo 2.Conversão Matricial de Curvas...........................................................................13
2.1.Objetivo 13
2.2Primitivas de Saída Gráfica 13
2.3.Algoritmo de Ponto Médio (Bresenham)24
2.1. Exercícios 30
Capítulo 3.Transformações Geométricas..............................................................................31
3.1Transformações 2D 31
3.2 Laboratório TG 2D em MatLab 33
3.1 Transformações 3D 37
3.4 Coordenadas Homogêneas 38
3.5 Composição de Transformações 40
Capítulo 4.Modelagem Geométrica......................................................................................42
4.1 Wireframe 45
4.2 Instanciamento Primitivo 45
4.3 Varredura 46
4.4 Decomposição 46
4.5 GSC – Geometria Sólida Construtiva 47
4.6 Fronteira 48
Capítulo 5 Curvas e Superfícies..........................................................................................50
Capítulo 5 .1 Curvas.............................................................................................................50
Capítulo 6.Fundamentos de Cor............................................................................................55
6.1 Conceitos Básicos 55
6.2.Sistemas de Cores Primárias 56
Capítulo 7 Processamento de Imagem.................................................................................58
7.1 Representação Digital de Imagem 58
7.2 Quantização 61
7.3 Amostragem 66
7.4.Histograma 68
7.5.Thresholding 69
5.6 Filtros 72
5.7 Morfologia Matemática 77
5.8 Estudo de Casos 82
5.9 Reconhecimento de Padrões 86

Computação Gráfica e Processamento de Imagem 2


Prof Kesede R Julio

1.Introdução

1.1.Breve Histórico

A história da Computação Gráfica (CG) remonta a história dos


computadores. Daremos, no entanto, um breve histórico de como tudo começou.

1950-1960 :- Primeiros pontos, linhas e figuras visualizadas em tubos de raio


catódicos (CRT).

1960-1970 :- Primeiros jogos utilizando CG: SpaceWar (1961 - estudantes do


MIT), Odyssey (primeiro video game comercial). É fundada a “Evans &
Sutherland”, primeira empresa de CG da história. Em 1968, o primeiro comercial
de televisão utilizando gráficos vetoriais. Primeiros simuladores de Realidade
Virtual (RV).

Computação Gráfica e Processamento de Imagem 3


Prof Kesede R Julio

SpaceWars- Além de ter sido o primeiro jogo eletrônico, foi


também a primeira simulação de computador a exibir uma
representação gráfica. Desenvolvido em 1961, no MIT, por um
hacker chamado "Slug" Russell, funcionava num computador do
tipo mainframe, o PDP-1, da empresa DEC.
Ano de lançamento: 1961
Instituto: MIT
Gênero: Arcade (?)
Gráfico: Duas cores
Som: Nenhum
Comportamento: Regras

Espaço – Restart
P - Pause
Ação Nave Nave Magra
Gorda
Atira V .
Acelera C ,
Gira sentido horário X M
Gira sentido anti- Z N
horário

1970-1980 :- Os jogos tornam-se o centro das atenções comerciais. Grande uso


da CG em filmes tendo como principal estrela, Star Wars (1977).

Pong: Primeiro game a ter uma distribuição de massa, o


Pong foi inspirado no osciloscópio, um instrumento
eletrônico que permite observar sinais elétricos num tubo de
raios catódicos, como a TV e as telas de computador.
Depois que a General Instruments lançou o primeiro chip
barato, foi possível construir um sistema completo de Pong
com poucos componentes externos. Uma indústria inteira
foi criada e centenas de fabricantes lançaram sua própria
linha do produto.
Ano de lançamento: 1972
Empresa: Atari
Gênero: Arcade
Gráfico: Duas cores
Som: 1 bit
Comportamento: Regras

1980-1990 :- Surgiram os computadores domésticos com interface gráfica.


Aumento significativo do uso de CG em filmes de Holywood, videoclipes (Dire
Straits-1985), curta-metragens de animação digital.

Computação Gráfica e Processamento de Imagem 4


Prof Kesede R Julio

IBM PC™ (Personal Computer), is a trade mark


of IBM. The predecessor of the current personal
computers and progenitor of the IBM PC
compatible hardware platform, it was introduced
in August 1981. The original model was
designated the IBM 5150. It was created by a
team of 12 engineers and designers under the
direction of Don Estridge of the IBM Entry
Systems Division. The introduction of the PC
changed the world of IBM in 1981.

1990-2000 :- Grandes produções cinematográficas usando CG (Jurrassic Park,


Independence Day, Godzilla, Men in Black etc). Primeiro longa-metragem de
animação digital (Cassiopéia (Brasil), Toy Story(EUA)).

Cassiopédia – 1992 - Primeiro longa-metragem Toy Story – 1995 – Primeira animação longa-
totalmente computadorizado metragem totalmente computadorizada feita
pela Disney. Diferentemente do Cassiopéia,
usaram massas como modelos.

2000-atual :- Tendência na produção de “atores digitais” (Aki Ross em Final


Fantasy). Biometria. RV.

Computação Gráfica e Processamento de Imagem 5


Prof Kesede R Julio

Atores Digitais. Dr. Aki Ross é a atriz


digital do filme “Final Fantasy”
produzido em 2001. Ela é a primeira
atriz fotorealística gerada por
computador.

Biometria. O uso de biometria digital na


Disney World.

Realidade Virtual. O modelo de uma rua


da cidade de Nova York.

1.2.Contextualização

Modelagem
Geométrica
Visão
Computacional
DADOS Computação
Análise de Síntese de Gráfica
Imagens Imagens
IMAGENS

Processamento de
Imagens

Computação Gráfica e Processamento de Imagem 6


Prof Kesede R Julio

1.3Aplicações

As aplicações de CG são inúmeras e eu diria até infinitas, as


possibilidades. Indo desde a área médica, passando pelo entretenimento e
chegando as indústrias. Podemos citar algumas destas aplicações, como:
medicina, animação digital, simulação visual, multimídia na web etc

1.4Dispositivos Gráficos
Os dispositivos gráficos se dividem em dois: Vetorial e Matricial.
Os Vetoriais se utilizam de um tipo de varredura chamada “Randon
Scan”, que significa que os desenhos são apresentados aleatoriamente, ou seja,
apenas os pontos que representarão a figura são acessados. Este processo se
utiliza de um “Display List” armazenado na memória, o qual armazena todos os
comandos e informações (coordenadas x,y) para o desenho das figuras. O
principal problema destes dispositivos é que a permanencia da figura é de
aproximadamente 40 microsegundos apenas, por isso esta lista (Display List) deve
ser acessada várias vezes, afim de executar o “refresh” e manter a figura sendo
exibida por mais tempo. Quando o tempo de refresh é maior que a persistência do
fósforo (elemento químico que é aceso em cada ponto do dispositivo) temos o que
chamamos de “flickering” (piscada) de tela. É quase impossível para estes
dispositivos o preenchimento de áreas. Abaixo vemos um exemplo do desenho de
um triângulo.

Já os Matriciais se utilizam de uma técnica de rastreamento chamada “Raster


Scan”, onde todas as posições endereçáveis do dispositivo são percorridas (de
cima para baixo e da esquerda para direita). A medida que há o rastreamento a
figura é desenhada nas posições onde se encontram. Todo o display é
armazenado através de uma matriz de pixels (pontos do video) em um frame

Computação Gráfica e Processamento de Imagem 7


Prof Kesede R Julio

buffer (memória de vídeo), por isso não há “Display List”, ficando muito mais fácil a
execução do refresh. Um grande problema deste tipo de dispositivo é o desenho
de linhas, principalmente quando fora dos eixos simétricos. Apesar deste
problema, estes dispositivos se tornaram populares com o evento dos
computadores domésticos em meados de 1980, devido a grande redução de
custo das memórias e apesar dos dispositivos Randon Scan terem melhor
resolução que os Raster Scan. A figura abaixo mostra um exemplo de Raster
Scan.

A qualidade de um dispositivo raster é dada por vários fatores inerentes as suas


dimensões físicas e gráficas.

1.5Resolução Gráfica
Todos os dispositivos gráficos possuem uma grade (matriz) lógica capaz de
endereçar cada uma de suas intersecções e, assim, representar pontos de
visualização. Ao número de pontos endereçáveis na vertical e na horizontal damos
o nome de resolução gráfica. Existem 4 parâmetros básicos para o cálculo desta
resolução:

NDH -> número de posições (dots) endereçáveis horizontalmente


NDV -> número de posições endereçáveis verticalmente
WIDTH -> largura física (em milímetros) da área endereçável
HEIGHT -> altura física (em milímetros) da área endereçável
Através destes valores podemos conhecer algumas características importantes
dos dispositivos.
Resolução Horizontal -> ResHoriz = NDH/WIDTH

Computação Gráfica e Processamento de Imagem 8


Prof Kesede R Julio

Tamanho do ponto na horizontal -> TamPtHoriz = WIDTH/NDH


Resolução Vertical -> ResVert = NDV/HEIGTH
Tamanho do ponto na vertical -> TamPtVert = HEIGTH/NDV
Total de pontos endereçaveis -> NDV*NDH
Aspect Ratio Gráfico -> AspRatGraf -> TamPtVert/TamPtHoriz
Aspect Ratio Físico -> AspRatFis -> HEIGTH/WIDTH

1.6Sistemas de Coordenadas
1.6.1.Coordenada de Dispositivo

Quando uma imagem é visualizada em um dispositivo, um modelo do mundo real


está ali sendo representado. Bem, ambientes diferentes, coordenadas diferentes.
Toda visualização em qualquer dispositivo deve ser dimensionada e posicionada
de acordo com as dimensões do próprio dispositivo, localização da imagem no
visor e claro, do zoom de imagem que se pretende aplicar. Tudo isso requer
transformações e conversões nas medidas reais daquilo que se quer representar.
Verificaremos agora, como transformar medidas do mundo real para medidas de
dispositivo. A visualização em dispositivos gráficos matriciais é realizada através
de uma matriz de pixels, Cada pixel possui uma coordenada x,y, onde x e y são
números inteiros (pois não conseguimos endereçar meio pixel). Portanto:
0 ≤ dcx ≤ ndhm1
0 ≤ dcy ≤ ndvm1
Onde:
dcx -> coordenada x (coluna) do dispositivo
dcy -> coordenada y (linha) do dispositivo
ndhm1 -> numero de pontos(dots) na horizontal menos 1
ndvm1 -> numero de pontos(dots) na vertical menos 1
Devemos considerar que o primeiro pixel endereçável (0,0) está no canto inferior
esquerdo do retângulo de visualização.

1.6.2Coordenadas Normalizadas

Devido a grande variedade de dispositivos existentes e cada um ter a sua


representação de coordenadas, o uso das coordenadas normalizadas de
dispositivos (NDC) tornaram-se imprescindíveis. Estas coordenadas variam de 0 a
1. Logo:

Computação Gráfica e Processamento de Imagem 9


Prof Kesede R Julio

0 ≤ ndcx ≤ 1
0 ≤ ndcy ≤ 1
Onde:
ndcx -> coordenada de dispositivo normalizada x
ndcy -> coordenada de dispositivo normalizada y
Considere que a posição NDC(0,0) corresponde a DC(0,0) e NDC(1,1)
corresponde a DC(ndhm1,ndvm1).
A transformação das coordenadas do mundo em coordenadas normalizadas, faz
com que a discussão de posicionamento fique independente do dispositivo de
visualização. Claro que quando do momento da visualização estas coordenadas
devem ser transformadas para dispositivo. Portanto:
dcx=round(ndcx.ndhm1)
dcy=round(ndcy.ndvm1)

1.6.3Coordenada Física ou do Objeto

Neste caso, cada objeto a ser representado, torna-se seu próprio


sistema de coordenada. Suas medidas podem ser dadas em milímetros ou
polegadas. Sua representação é dada por PC(pcx,pxy), onde:
pcx -> é a distância física ao longo do eixo x a partir do extremo esquerdo do
retângulo de visualização até a posição em referência.
pcy -> é a distância física ao longo do eixo y a partir do extremo inferior do
retângulo de visualização até a posição em referência.
A transformação de PC para DC é dada por:
dcx = trunc(ndhm1. (pcx/width))
dcy = trunc(ndvm1. (pcy/heigth))
Repare que a divisão retorna um valor em percentual a ser multiplicado pela
quantidade de pontos endereçáveis, tanto na horizontal quanto na vertical. O valor
deve ser truncado, pois a medida em milímetros deve ser convertida em pixel.

1.6.4Coordenada do Usuário ou do mundo

Tem seus limites e unidade de medida definidos pelo usuário, ou seja,


dependerão da aplicação. Para fins de exercícios consideraremos uma
representação no plano cartesiano. Será representado por UC(x,y).
xmin ≤ x ≤ xmax
ymin ≤ y ≤ ymax

Computação Gráfica e Processamento de Imagem 10


Prof Kesede R Julio

ndcx = (x-xmin) / (xmax-xmin)


ndcy = (y-ymin) / (ymax-ymin)

Note que no denominador temos a medida exata da janela (horizontal e vertical) e


no numerador temos a distância do ponto inicial da janela até o ponto que
queremos converter. O resultado desta divisão é uma proporção, bem próprio da
coordenada normalizada.

1.1Exercícios
1.1.1.Faça uma pesquisa sobre 3 diferentes aplicações de CG, diferentes das apresentadas
anteriormente. Defina qual a área específica (Visão Computacional, Processamento de
Imagem etc) de cada aplicação, exemplificando com imagens, videos etc.
1.1.2.Faça uma pesquisa das características de resolução de 3 modelos diferentes de
fabricantes diferentes e mostre um relatório da sua pesquisa.
1.1.3.Escreva funções (em qualquer linguagem) de todas as conversões possíveis de
coordenadas. Crie um pequeno aplicativo que se utilize destas funções.

Computação Gráfica e Processamento de Imagem 11


Prof Kesede R Julio

2.Conversão Matricial de Curvas


Um estudo das técnicas para implementação de algoritmos de conversão Matricial
(Scan Converting Algorithms ) de curvas de um modo geral (linhas,
circunferências, elipses).

2.1.Objetivo
Quais pixels devem ser alterados para garantir uma visualização contínua de
linhas, curvas e objetos.

Ilustração 1Eixos de Simetria Ilustração 2Reflexão sem deformação

2.2Primitivas de Saída Gráfica


• Procedimentos que tomam a coordenada de entrada, e invocam algoritmos de
display para construir uma forma geométrica em localizações designadas em
um dispositivo de saída.
• Os componentes geométricos mais simples de um quadro são pontos e linhas.
Outros tipos de primitivas de saída são áreas poligonais, figuras curvas e linhas
de caracteres. Para cada tipo de primitiva de saída, consideramos as técnicas
básicas e algoritmos para mostrar as primitivas em diferentes tipos de sistemas
gráficos, tais como sistemas vetoriais e raster.
• A plotagem de pontos é implementada num pacote gráfico pela conversão das
coordenadas de informação de um programa de aplicações com instruções
para o equipamento de saída em uso.

2.2.1Desenho de linhas

Equação da reta: y = m.x + b

Computação Gráfica e Processamento de Imagem 12


Prof Kesede R Julio

onde:
m é a inclinação da linha (coeficiente angular) e
b a interceptação de y (coeficiente linear).

Dados dois pontos (x1, y1) e (x2, y2), temos:

m = (y2 – y1 )/(x2 – x1) = D y / D x


b = y1 – m . x1
b = y1 – (D y / D x ) . x1

y2

y1

x1 x2 x

Afim de escolher qual pixel plotar quando do traçado de uma reta, podemos levar
em consideração vários critérios de escolha. Estudaremos estes critérios a partir
de um modelo de reta localizado no primeiro octante (0 o < inclinação < 45o). Por
isso, não teremos problemas em escolher a coordenada x, a qual será sempre
escolhido a cada intersecção, porém a coordenada y exige um estudo de critérios,
os quais possuem vantagens e desvantagens.
Critério 1 :- Seleciona-se o pixel imediatamente abaixo e acima do ponto de
intersecção do segmento em cada vertical, exceto quando o ponto de intersecção
coincide com um pixel (ponto endereçável). Problemas: linhas densas
Critério 2 :- Seleciona-se o pixel através do arredondamento do valor da
coordenada. Problemas: com segmentos no ponto médio da vertical, cria-se linhas
densas.
Critério 3 :- Seleciona-se o pixel mais próximo do ponto de intersecção do
segmento com o eixo vertical. Vantagens: aparência leve e continuidade
Critério 4 :- Seleciona-se o pixel mais próximo do ponto de intersecção do
segmento com o eixo horizontal. Problemas: descontinuidade

Computação Gráfica e Processamento de Imagem 13


Prof Kesede R Julio

Características de um bom conversor.


1. Linearidade:- aparência de reta
2. Precisão:- Evitar gaps no início ou final do segmento
3. Espessura uniforme:- Intensidade e espessura constante em todo o segmento
4. Intensidade independente da inclinação:- no caso de segmentos com diferentes
inclinações
5. Continuidade:- Segmento sem interrupção (gaps internos)
6. Rapidez no traçado dos segmentos:- Velocidade ótima em qualquer inclinação.

De todos os critérios que estudamos, o terceiro critério nos parece a melhor


solução.
Seja um segmento de reta definido por seus extremos P(x1, y1) e P(x2, y2).
Supondo que este segmento se encontra no primeiro octante, vale as relações:

0 < x1 < x2
0 < y1 < y2
y2 - y1 < x2 - x1

Nestas condições o segmento corta um maior numero de verticais que horizontais


Exemplos de resultados pelo critério 3

Computação Gráfica e Processamento de Imagem 14


Prof Kesede R Julio

Neste estudo estamos desconsiderando:


• Linhas grossas e estilos diferentes
• Cantos de polígonos arredondados

Afim de exercitarmos o que vimos, segue abaixo o código em C que implementa a


teoria, utilizando biblioteca Allegro e outro exemplo usando a biblioteca OpenGL.
Equação da reta: y=y1+m (x-x1)

Onde: m = (y2-y1) / (x2-x1)


Exemplo 2.1: Este código traça qualquer linha no primeiro octante.
Estaremos usando a biblioteca Allegro instalada no Dev-Cpp. Nas opções de
parâmetros de linker (Tools/Compiler Options) deve ser setado (-lalleg)
// Tracado de reta no primeiro quadrante
#include <allegro.h>
#include <iostream.h>
void traca(float x1, float x2, float y1, float y2);
int main(){
float x1,x2,y1,y2;
cout <<"Entre com o valor de x1: ";
cin >>x1;
cout <<"Entre com o valor de y1: ";
cin >>y1;
cout <<"Entre com o valor de x2: ";
cin >>x2;
cout <<"Entre com o valor de y2: ";
cin >>y2;
cout <<"\n";
traca(x1,y1,x2,y2);

}
void traca( float x1, float y1, float x2, float y2){

Computação Gráfica e Processamento de Imagem 15


Prof Kesede R Julio

float m;
float x,y;
allegro_init();
install_keyboard();
set_gfx_mode(GFX_AUTODETECT_WINDOWED,640,480,0,0);
m=(y2-y1) / (x2-x1);
cout<<"valor de m: "<<m<<"\n\n";

for( x=x1; x<=x2; x++){


y= (y1 + m * (x-x1));
putpixel(screen,(int)x, 500-(int)y, makecol(255,255,0));
}
readkey();
}
END_OF_MAIN()

Exemplo 2.2: Este código traça qualquer linha no primeiro octante. Estamos usando aqui a
biblioteca Opengl no ambiente do Dev. Este codigo deve ser criado dentro de um projeto
(.dev) e nas opções de parâmetros de linker do projeto deve ser setado (-lopengl32 -lglut32
-lglu). A Glut tambem deve estar instalada.
#include <GL/glut.h>
#include <stdlib.h>
// prototipos das funcoes
void init(void);
void display(void);
void keyboard(unsigned char key, int x, int y);
// funcao principal
int main(int argc, char** argv){
glutInit(&argc, argv); // inicializa o glut
// especifica o uso de buffer e modo de cores
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
// especifica as dimensoes da janela
glutInitWindowSize (256, 256);
// especifica aonde a janela aparece na tela
glutInitWindowPosition (100, 100);
glutCreateWindow ("Desenhando uma linha"); // cria a janela
init();
// funcao que sera redesenhada pelo GLUT

Computação Gráfica e Processamento de Imagem 16


Prof Kesede R Julio

glutDisplayFunc(display);
glutKeyboardFunc(keyboard); // funcoes de teclado
glutMainLoop(); // mostra todas as janelas criadas
return 0;
}
// definicao de cada funcao
void init(void){
glClearColor(0.0, 0.0, 0.0, 1.0); // cor de fundo
// define os eixos do modo de projecao ortogonal
glOrtho (0, 256, 0, 256, -1 ,1);
}
void display(void){
GLfloat m,x1,x2,y1,y2,y,x;
glClear(GL_COLOR_BUFFER_BIT); // apaga tela
// define pontos iniciais e finais para a reta no primeiro octante
x1=10; y1=50; x2=280; y2=100;
m=(y2-y1)/(x2-x1); // calcula inclinacao
// traça reta incrementando x de 1 em 1 e y sendo calculado
for(x=x1;x<=x2;x++){
y=(y1+m*(x-x1));
glBegin(GL_POINTS);
glVertex2f(x,y);
glEnd();
}
glFlush(); // descarrega na tela tudo o que foi traçado
}
void keyboard(unsigned char key, int x, int y){
switch (key) {
case 27: // tecla Esc (encerra o programa)
exit(0);
break;
}
}

2.2.1Desenho de Circunferências

Os parâmetros básicos que definem uma circunferência são as


coordenadas do centro e o raio r. Podemos expressar a equação de uma

Computação Gráfica e Processamento de Imagem 17


Prof Kesede R Julio

circunferência de várias formas, usando parâmetros de coordenadas Cartesianas


ou Polares.

Coordenadas Cartesianas :- ( x - xc )2 + ( y - yc )2 = r2

Coordenadas Polares :-
x = xc + r . cos 
y = yc + r . sen 

Onde:
xc é a coordenada x do centro da circunferência
yc é a coordenada y do centro da circunferência
r é o raio da circunferência
é o ângulo de x e de y, respectivamente

Exemplo 2.3: Traça uma circunferência usando o Allegro.


// Traca circunferencia
#include <allegro.h>
#include <stdio.h>
#include <math.h>

void circ(float xc,float yc,float r);

int main(){
float xc, yc, raio;

printf("Entre com o valor de xc: ");


scanf("%f",&xc);
printf("Entre com o valor de yc: ");
scanf("%f",&yc);
printf("Entre com o valor do raio: ");
scanf("%f",&raio);
circ(xc,yc,raio);

Computação Gráfica e Processamento de Imagem 18


Prof Kesede R Julio

}
END_OF_MAIN()

void circ(float xc,float yc,float r){


float ang,ang_rad,x,y;

allegro_init();
install_keyboard();
set_gfx_mode(GFX_AUTODETECT_WINDOWED,800,600,0,0);

// traça circunferencia incrementando o ângulo (ang) de 1 em 1.


// o ângulo tambem está sendo convertido para radianos.
for(ang=1;ang<=360;ang++){
ang_rad=(ang*3.14)/180;
x = xc + (r * cos (ang_rad));
y = yc + (r * sin (ang_rad));
putpixel(screen,(int)x, 600-(int)y, makecol(0,255,0));
}
readkey();
}

Exemplo 2.4: Troque a função display() do exemplo 2.2 por esta.


void display(void){
GLfloat m,xc,yc,r,ang,ang_rad,x,y;

glClear(GL_COLOR_BUFFER_BIT); // apaga tela

// define ponto central e raio


xc=80;
yc=80;
r=50;

Computação Gráfica e Processamento de Imagem 19


Prof Kesede R Julio

// traça circunferencia incrementando o ângulo (ang) de 1 em 1.


// o ângulo tambem está sendo convertido para radianos.
for(ang=1;ang<=360;ang++){
ang_rad=(ang*3.14)/180;
x = xc + (r * cos (ang_rad));
y = yc + (r * sin (ang_rad));
glBegin(GL_POINTS);
glVertex2f(x,y);
glEnd();
}
glFlush(); // descarrega na tela tudo o que foi traçado
}

2.2.3Elipses

O Algoritmo de desenho de circunferências pode ser estendido para traçar elipses.


Uma circunferência é uma elipse, onde tanto o raio maior como o raio menor são
iguais. No caso, quando vamos determinar a equação da elipse, determinamos
dois raios diferentes, r1 chamado de raio maior e r2 chamado de raio menor, o
centro está no ponto (xc, yc). Logo, temos que:

Coordenadas cartesianas:- ( x – xc / r1 )2 + ( y – yc / r2 ) 2 = 1

Coordenadas polares :-
x = xc + r1 . cos 
y = yc + r2 . sen 

Estas implementações de traçado de curvas são experimentais. Existem vários


outras propostas para traçarmos estas primitivas de forma mais otimizada.

Exemplo 2.5 : Traça elipse usando Allegro


// Traca circunferencia
#include <allegro.h>
#include <stdio.h>
#include <math.h>

Computação Gráfica e Processamento de Imagem 20


Prof Kesede R Julio

void circ(float xc,float yc,float r1,float r2);

int main(){
float xc, yc, raio1, raio2;

printf("Entre com o valor de xc: ");


scanf("%f",&xc);
printf("Entre com o valor de yc: ");
scanf("%f",&yc);
printf("Entre com o valor do raio 1: ");
scanf("%f",&raio1);
printf("Entre com o valor do raio 2: ");
scanf("%f",&raio2);
circ(xc,yc,raio1,raio2);
}
END_OF_MAIN()

void circ(float xc,float yc,float r1, float r2){


float ang,ang_rad,x,y;

allegro_init();
install_keyboard();
set_gfx_mode(GFX_AUTODETECT_WINDOWED,800,600,0,0);

// traça circunferencia incrementando o ângulo (ang) de 1 em 1.


// o ângulo tambem está sendo convertido para radianos.
for(ang=1;ang<=360;ang++){
ang_rad=(ang*3.14)/180;
x = xc + (r1 * cos (ang_rad));
y = yc + (r2 * sin (ang_rad));
putpixel(screen,(int)x, 600-(int)y, makecol(0,255,0));

Computação Gráfica e Processamento de Imagem 21


Prof Kesede R Julio

}
readkey();
}

2.3.Algoritmo de Ponto Médio (Bresenham)

O Algoritmo visto anteriormente tem o problema de ser muito lento para ser
traçado, uma vez que se utiliza de ponto flutuante para cálculo de x e y
(dependendo da inclinação). O algoritmo de Ponto Médio, desenvolvido por
Bresenham em 1965 tem a vantagem de eliminar o uso do ponto flutuante
substituindo-o por inteiro. Este método também é chamado de "Incremental", uma
vez que para calcular (xi+1, yi+1) usamos os valores já calculados de x i e yi. Este
Algoritmo foi desenvolvido tanto para o desenho de linhas como para o desenho
de circunferências e elipses. A seguir veremos cada um deles.

2.3.1Ponto Médio para Linhas

O nosso problema sempre será decidir qual pixel iremos escolher para continuar o
traçado. Considere, no traçado de linhas, a figura abaixo.

NE
yp+1
I
M
yp
P=(xp,yp) E

xp xp+1

Neste estudo, estaremos considerando um segmento cuja inclinação está entre 0


e 1 (primeiro octante) e x1 < x2 e y1 < y2 (o segmento começa na esquerda e segue
para direita), as outras inclinações poderão ser feitas por simetria.
Dado que o pixel P(xp,yp) foi escolhido, precisamos escolher qual o próximo pixel
(E ou NE). Para proceder esta escolha verificamos onde se localiza o ponto M

Computação Gráfica e Processamento de Imagem 22


Prof Kesede R Julio

(Ponto Médio) em relação a I (ponto de intersecção da próxima vertical com a reta


a ser traçada). Caso este Ponto Médio esteja acima da reta, o pixel E é escolhido,
caso esteja abaixo dela, o pixel NE é escolhido. Dessa forma, o erro da escolha
neste algoritmo será sempre menor ou igual a ½.
Precisamos agora de um método matemático para verificar de que lado (acima ou
abaixo) M está em relação a reta.
Considerando a equação da reta em termos de sua inclinação:
y=axb ,

sendo dy e e
a= dy= y 2− y 1 dx=x 2− x1
dx
Substituindo na equação temos:
dy
y= xb
dx
Agora podemos igualar esta equação a zero, assim:
dy
y= x+ b
dx

dy⋅x
y= +b (multiplicação da fração por x /1)
dx

dy⋅x+ b⋅dx
y= (divide pelo denominador e multiplica pelo numerador )
dx

dx⋅y=dy⋅x+ b⋅dx (transporta o dx para a esquerda)

dy⋅x−dx⋅y+ b⋅dx=0 (iguala a equação a zero)

Agora, considere a equação implícita da reta:

F  x , y =axbyc=0

Através da equação da reta em função de sua inclinação, conseguimos os termos


da equação implícita. Assim:

F (x , y)=dy⋅x−dx⋅y+ b⋅dx =0
Logo,

a=dy
b=−dx
c=b⋅dx

Computação Gráfica e Processamento de Imagem 23


Prof Kesede R Julio

Para pontos sobre a reta, teremos sempre F(x,y)=0, acima da reta F(x,y) < 0
(negativa) e abaixo dela teremos F(x,y)>0 (positiva). Para efetuar a verificação
desta afirmação, escolha dois pontos quaisquer e, através da equação da reta,
encontre pelo menos mais dois pontos. Agora, substitua qualquer desses pontos
na equação implícita.
Caso o ponto médio pertença a reta, o cálculo de F(M) = F(x p+1, yp+ ½ ), será 0
(zero) e então podemos escolher E ou NE. Caso a função seja positiva, significa
que o ponto médio está abaixo do segmento e, portanto escolhemos o pixel NE;
caso seja negativa, o ponto está acima do segmento, e portanto escolhemos o
pixel E.
Como estaremos decidindo através de F(M), passaremos a chamá-lo de variável
de decisão (d).
Esta decisão definirá a escolha do próximo ponto E ou NE. Portanto, se E for
escolhido, incrementamos 1 em x; caso NE seja escolhido incrementamos 1 em x
e também em y.
Caso E seja escolhido,
1 1
d novo=F  x p2, y p =a x p 2b y p  c
2 2
e
1
d anterior =a  x p1b y p c
2
Subtraindo danterior de dnovo obtemos a diferença incremental ΔE.
1
ax p 2aby p bc
2

1
ax p  aby p bc
2
=
a

ΔE = a = dy

Afim de eliminar a fração de b multiplicamos toda a equação por 2, o que não


muda em nada no resultado que nos interessa que é o seu sinal. Portanto:
ΔE=2dy.
Caso NE seja escolhido,

3 3
d novo=F  x p2, y p =a x p 2b y p  c
2 2
e

Computação Gráfica e Processamento de Imagem 24


Prof Kesede R Julio

1
d anterior =a  x p1b y p c
2
Subtraindo danterior de dnovo obtemos a diferença incremental ΔNE.
3
ax p 2aby p bc
2

1
ax p  aby p bc
2
=
ab

ΔNE= a + b = dy - dx
Aqui também afim de eliminar a fração de b multiplicamos toda a equação por 2.
Portanto: ΔNE=2(dy-dx).
Com isso encontramos o incremento caso o ponto E seja escolhido e o incremento
caso NE seja escolhido. Bem, agora precisamos da variável dinicial , pois é ela que
será incrementada. Sabendo que o ponto inicial (x 1, y1) é um ponto da reta,
podemos então calcular o d inicial para escolha do primeiro E ou NE. Então,
1
F  M =d inicial =a  x p 1b  y p c=
2
b
= ax p aby p  c=
2
b
= ax p by pca =
2
b
= F  x p , y p a =
2
b
= a
2

Também afim de eliminar a fração multiplicamos por 2, e portanto,


d inicial =2ab=2dy −dx .

2.3.2 Ponto Médio para Circunferências

Assim como para linhas, o objetivo do algoritmo para as circunferências é plotar o


próximo ponto. Para isso, consideraremos a equação da circunferência:
2 2 2
F  x , y =x  y −R

Computação Gráfica e Processamento de Imagem 25


Prof Kesede R Julio

Trataremos do traçado da circunferência apenas para o segundo octante


( 0≤x ≤R⋅√( 2) e R≥ y≤R √ (2) ), todos os demais pontos poderão ser
traçados por simetria.
xp xp+1
P=(xp,yp) E
yp
M

yp-1
SE

Neste caso, dado um ponto P x p , y p  , queremos traçar o próximo ponto E ou


SE. Novamente avaliamos o F(M) = d (variável de decisão), afim de tomarmos a
melhor decisão. O ponto inicial escolhido é P(0,R), portanto o próximo ponto
1
médio está em 1, R−  . Substituindo este ponto da equação, temos:
2
1 2 1 2 5 2
F 1, R− =1R −R −R = −R
2 4 4
Para determinarmos os incrementos (ΔE e ΔSE), procedemos da mesma forma
que no algoritmo da linha. Caso seja escolhido E, incrementamos 1 em x; caso
seja SE incrementamos 1 em x e decrementamos 1 em y.
Caso seja escolhido E, então:

1 1 2
d anterior =F  x p1, y p− = x p 1  y p−  −R2
2

2 2

1 1 2
d novo=F  x p2, y p− = x p22 y p−  −R 2
2 2

Ao subtrairmos o danterior de dnovo, encontramos a diferença incremental de ΔE.


Podemos cancelar os dois últimos termos e calcular apenas o primeiro, assim:

Computação Gráfica e Processamento de Imagem 26


Prof Kesede R Julio

d anterior= x p12− = x 2p 2x p 112− = x2p2x p 1−

d novo = x p 22− = x 2p2x p 222− = x 2p 4x p4−

ΔE =2x p3
Caso SE seja escolhido, temos:

3 3 2
d novo=F  x p2, y p− = x p22 y p−  −R 2
2 2
Desta forma, fazendo a subtração com o d anterior , teremos ΔSE. Como os
terceiros termos são iguais, podemos cancelá-los, calculando apenas o primeiro e
o segundo termo. A subtração do primeiro termo já foi calculada no ΔE, assim
podemos calcular apenas o segundo termo:

2 1 2
d anterior = x p 1  y p−  −=
2
2 2 1 1 2
 x p1  y p −2⋅y p⋅   − =
2 2
1
 x p12 y p2− y p −
4

3 2
d novo =  x p22 y p−  − =
2
3 3 2
 x p22 y 2p−2⋅y p⋅   − =
2 2
9
 x p22 y2p−3y p −
4
ΔE=2x p3−2y p2=2x p−2y p5

2.1. Exercícios

2.4.1.Desenvolva métodos para implementação destas curvas, utilizando qualquer


linguagem de programação (Java, C++, C, pascal etc).
2.4.2.Desenhe um boneco utilizando apenas as primitivas vistas. O boneco deve possuir:
cabeça (circulo), olhos (elipse), braços, pernas e tronco (linhas).
2.4.3.Faça este boneco piscar os olhos.
2.4.4.Modifique a função que desenha a reta, trocando-a pelo algoritmo de Ponto Médio
(Bresenham).

Computação Gráfica e Processamento de Imagem 27


Prof Kesede R Julio

3.Transformações Geométricas
A Transformação Geométrica (TG) nos permite modificar a dimensão de um objeto
em uma cena, assim como mudá-lo de posição ou menos girá-lo sob um
determinado grau, a partir de um determinado ponto.

3.1Transformações 2D

As Transformações 2D são realizadas no plano cartesiano. Existem, basicamente,


3 transformações possíveis: translação, rotação e escala. As transformações aqui
apresentadas serão efetuadas em relação à origem.

3.1.1 Translação

O movimento de translação é realizado através da soma de um deslocamento em


x (tx) e/ou em y (ty). Dado um ponto P(x, y), podemos transladá-lo em x, assim o
novo ponto seria P'(x', y'). Para deslocarmos o ponto em y a regra é a mesma.
Então x' é x transladado de tx e y' é o y transladado de ty. O deslocamento pode
ser positivo ou negativo, dependendo do destino que se quer dar ao ponto.
x' = tx + x
y' = ty + y
Podemos representar estes pontos e deslocamento em matriz, assim:

P = x
[]
y

[ ]
P '= x'
y'

[]
T = tx
ty

Portanto, a equação em termos destes vetores, é:


P'= T + P
Podemos transladar um objeto, transladando ponto a ponto da forma vista acima,
no entanto isto torna-se caro computacionalmente. Então podemos, por exemplo,
para transladar um linha, transladar apenas o seu ponto inicial e o seu ponto final,
retraçando a linha no destino. Isto pode ser feito com polígonos através de seus
vértices.
Veja o exemplo de um objeto translado em T(1,2).

Computação Gráfica e Processamento de Imagem 28


Prof Kesede R Julio

y
y (3.5, 7)
(2.5, 5)

(2,4) (5,4)

(1,2) (4,2)

x
x
Objeto na Posição inicial Objeto Transladado

3.1.2Escala

Podemos também, ao invés de transladar o objeto, escaloná-lo afim de adequá-lo


a uma determinada cena. Aplicamos, para isso, um fator de escala em x (sx) e um
fator de escala em y (sy). Estes fatores devem ser multiplicados pelos valores de x
e de y do ponto, respectivamente.
x'= sx * x
y' = sy * y
E portanto, matricialmente, teríamos:

P ' =S∗P  [ ][x'


y'
=
sx
0 ][ ]
0 x

sy y
Aplicando um fator sx=0.5 e sy=1.5 no objeto abaixo, teríamos:
(1.25, 7.5)
y
y
(2.5, 5)

(0.5,3) (2,3)
(1,2) (4,2)

x
x
Objeto na Posição inicial Objeto Escalonado

3.1.3 Rotação

Computação Gráfica e Processamento de Imagem 29


Prof Kesede R Julio

A TG de rotação permite girarmos um objeto de acordo com um determinado


ângulo (Θ) especificado. Para isso, precisamos aplicar fatores de rotação em x e
em y. Matematicamente, teríamos:
x '= x⋅cosΘ y⋅−sen Θ
y '= x⋅sen Θ y⋅cos Θ
e matricialmente, teríamos:

P '=R⋅P  [ ][ x'
y'
=
sen  cos 
⋅][ ]
cos  −sen  x
y
Aplicando uma rotação de 45o positivos no objeto abaixo, teremos a seguinte
transformação:

y
y
(2.5, 5)
(-2.9, 4.7 )
(0.3, 4.4 )

(1,2) (4,2)
(-1.1, 1.9 )
x
x
Objeto na Posição inicial Objeto Rotacionado

3.2 Laboratório TG 2D em MatLab


Primeiramente precisamos construir a matriz de pontos do objeto a ser
transformado. Trabalharemos com um quadrado 2x2, com o cse(2,4) e com o
cid(4,2). Para plotarmos este objeto criaremos uma matriz de pontos P, onde a
primeira linha representará o eixo “x” e a segunda linha o eixo “y”. O último ponto
deve ser igual ao primeiro para que o objeto seja fechado.
Vamos lá: No prompt do Matlab digite:
>> P=[2 4 4 2 2;4 4 2 2 4]
P=
2 4 4 2 2
4 4 2 2 4

Computação Gráfica e Processamento de Imagem 30


Prof Kesede R Julio

Aqui construímos uma matriz 2x5, onde cada coluna representa um ponto (x,y) do
objeto (sendo o último igual ao primeiro afim de fechar o quadrado). Vamos plotar
para visualizarmos o objeto. Digite:

>> plot(P(1,:),P(2,:)), xlim([0 10]), ylim([0 10]), grid on


Será mostrado um quadrado em um plano cartesiano x,y com escala de 0 a 10.
Agora mostraremos como efetuar as transformações neste objeto.

3.2.1 Translação

Vamos agora transladar o objeto com os fatores tx=2 e ty=1. Construa a matriz
translação digitando:

>> T=[2;1]
T=
2
1

Como a transformação de translação é aditiva e não multiplicativa, não podemos


somar toda a matriz Ponto (P) com a matriz Translação (T), devido a inconsitência
da ordem das matrizes. Assim, devemos somar cada coluna da matriz Ponto com
a matriz Translação, gerando cada coluna da matriz resultante Pt (Pontos
transladados). No prompt do MatLab digite:
>> Pt(:,1)=T+P(:,1)
Pt =
4
5

>> Pt(:,2)=T+P(:,2)
Pt =
4 6
5 5

>> Pt(:,3)=T+P(:,3)
Pt =
4 6 6

Computação Gráfica e Processamento de Imagem 31


Prof Kesede R Julio

5 5 3

>> Pt(:,4)=T+P(:,4)
Pt =
4 6 6 4
5 5 3 3

>> Pt(:,5)=T+P(:,5)
Pt =
4 6 6 4 4
5 5 3 3 5

Com a matriz Pt pronta, podemos plotá-la. Digite:

>> hold on;


>> plot(Pt(1,:),Pt(2,:)), xlim([0 10]), ylim([0 10]),grid on
>> hold off;

Pronto! Temos agora duas imagens do mesmo objeto, uma na posição inicial outra
na final (transladada).

Exercícios

1. Plote um triângulo P1(2,3) , P2(6,3) ,P3(4,5) e aplique a translação


T(3, -2).

3.2.2 Escalonamento

Construiremos uma matriz escala S, afim de escalonar o objeto com fator 0,5 em
“x” e 1,5 em “y”. Digite:

>> S=[0.5 0;0 1.5]


S=
0.5000 0

Computação Gráfica e Processamento de Imagem 32


Prof Kesede R Julio

0 1.5000

Com a matriz escala S construída podemos multiplica-la pela matriz de pontos,


afim de obter os novos pontos do objeto. Digite:

>> Ps=S*P
Ps =
1 2 2 1 1
6 6 3 3 6

Plotamos agora o objeto escalonado. Digite:


>> plot(P(1,:),P(2,:)), xlim([0 10]), ylim([0 10]), grid on
>> hold on;
>> plot(Ps(1,:),Ps(2,:)), xlim([0 10]), ylim([0 10]);
>> hold off;

Perceba que o objeto teve uma diminuição em 50% em “x” e teve um aumento de
50% em sua dimensão em “y”.

Exercícios

1. Plote um triângulo P1 (2,3) , P2(6,3) ,P3(4,5) e aplique um fator de escalonamento


S(0.3,0.7).

3.2.3 Rotação

Agora construiremos a matriz rotação R, assumindo que queremos rotacionar


17o19’ positivos (0,3 em radianos). Digite:

>> R=[cos(0.3) -sin(0.3); sin(0.3) cos(0.3)]


R=
0.9553 -0.2955
0.2955 0.9553

Computação Gráfica e Processamento de Imagem 33


Prof Kesede R Julio

Pronto! Com a matriz ponto P e a matriz rotação R construída, podemos fazer a


multiplicação das duas para conseguirmos os novos pontos da matriz rotacionada
Pr.

>> Pr=R*P
Pr =
0.7286 2.6393 3.2303 1.3196 0.7286
4.4124 5.0034 3.0928 2.5017 4.4124

Estes são os novos pontos do objeto rotacionado. Agora podemos plotá-lo sobre o
objeto em sua posição inicial para percebermos a rotação sendo realizada.

>> plot(P(1,:),P(2,:)), xlim([0 10]), ylim([0 10]), grid on


>> hold on;
>> plot(Pr(1,:),Pr(2,:)), xlim([0 10]), ylim([0 10]);
>> hold off;

Para limpar a janela do gráfico, digite:

>> clf

Exercícios

1. Crie uma matriz de pontos para um triângulo P1 (2,3), P2(6,3) ,


P3(4,5) e aplique uma transformação R-15.

3.3 Transformações 3D

A Transformação 3D acontece no espaço (x, y, z) e obedece as mesmas regras


das transformações 2D. Para gerar suas matrizes basta acrescentar uma coluna e
uma linha a cada uma delas. Assim:

Translação:

Computação Gráfica e Processamento de Imagem 34


Prof Kesede R Julio

[]
tx
T = ty
tz

Escala:

[ ]
sx 0 0
S= 0 sy 0
0 0 sz

Rotação:

[ ]
cos  −sen  0
R= sen   cos  0
0 0 1

Na rotação em 3D, temos a opção de escolhermos qual dos eixos ficará fixo, ou
seja, sobre qual eixo queremos que a rotação seja realizada. Por isso, teremos 3
matrizes possíveis.
Sobre o eixo z (no plano xy):

[ ]
cos  −sen  0
R= sen   cos  0
0 0 1

Sobre o eixo x (no plano yz):

[ ]
1 0 0
R= 0 cos  −sen 
0 sen  cos 

Sobre o eixo y (no plano xz):

[ ]
cos  0 −sen 
R= 0 1 0
sen   0 cos 

Computação Gráfica e Processamento de Imagem 35


Prof Kesede R Julio

3.4 Coordenadas Homogêneas

As matrizes de Rotação e de Escala são aplicadas sobre a matriz de Pontos


através de uma multiplicação, diferente da matriz Translação que tem um efeito
aditivo sobre a matriz de pontos.

Rotação : P’ = R * P
Escala : P’ = S * P
Translação : P’ = T + P

A fim de possibilitar as múltiplas transformações no ponto, utilizando composição


de matrizes (rotação, escala e translação), temos que fazer com que as
operações das matrizes de transformação com os pontos sejam consistentes
(todas devem ser multiplicativas em relação a matriz ponto).
Vamos demonstrar isto com as matrizes no plano (2D), mas por extensão, pode
ser aplicado as matrizes no espaço (3D).
Para que todas as operações possam ser multiplicativas, devemos converter as
coordenadas de cartesianas (x,y) para homogêneas (x,y,W). Na realidade, isso
significa que estaremos tratando pontos do plano (2D) através de três
coordenadas. A coordenada W poderá ser dividida por x e y, voltando assim para
sua representação cartesiana. Assim, P(2,3,5) também pode ser representada por
P(2/5,3/5,1). Ao usarmos este tipo de representação temos também que modificar
a forma de representação matricial. Desta forma, todo ponto teria o acréscimo da
coordenada homogênea representada pelo plano 1 do espaço 3D. Abaixo
apresentamos as novas matrizes de transformação.

Translação: P’ = T * P

[ ] [ ][ ]
x' 1 0 tx x
P ' =T⋅P  y ' = 0 1 ty ⋅ y
1 0 0 1 1

Escala: P’ = S * P

[ ][ ][ ]
x' sx 0 0 x
P ' =S⋅P  y ' = 0 sy 0 ⋅ y
1 0 0 1 1

Rotação: P’ = R * P

Computação Gráfica e Processamento de Imagem 36


Prof Kesede R Julio

[ ][ ][ ]
x' cos −sen  0 x
P ' =R⋅P  y ' = sen  cos  0 ⋅ y
1 0 0 1 1

No sentido de aplicarmos várias transformações sobre uma matriz de pontos,


podemos executar multiplicações consecutivas sobre as matrizes, obedecendo a
ordem de multiplicação da direita para a esquerda.

P’ = R * S * T * P

3.5 Composição de Transformações

As transformações realizadas sobre um mesmo ponto podem ser combinadas em


uma única matriz, no intuito de aumentar a eficiência da transformação. Esta
matriz é chamada de Matriz Composição.
Até agora todas as transformações foram realizadas a partir da origem, no
entanto, podemos desejar uma transformação a partir de qualquer ponto. Para
isso, podemos seguir os seguintes procedimentos:

1. Transladar a matriz de Pontos para a origem (To)


2. Aplicar as transformações necessárias (R e/ou S e/ou T) na origem.
3. Transladar a matriz de Pontos de volta (Tv ) para sua posição original.

MC = Tv * R * S * To
P´ = MC * P

Assim, se quisermos fazer uma rotação de 45 o negativa a partir do ponto (2,3), no


quadrado p1(3,3), p2(6,3), p3(6,6) e p4(3,6), executaremos a seguinte seqüência
de transformação:

MC = T(2,3) * (R-45 * T(-2,-3))


P´ = MC * P

Computação Gráfica e Processamento de Imagem 37


Prof Kesede R Julio

4.Modelagem Geométrica

Modelagem geométrica é um conjunto de métodos utilizados para descrever a


forma e características de um objeto.
A modelagem geométrica é de grande importância devido ao barateamento do
custo do processo industrial que as simulações oferecem. È mais barato construir,
analisar, alterar e manipular modelos que objetos.
As técnicas de modelagem são fartamente utilizadas em sistemas de CAD
(Computer Aided Design), animação, robótica etc. Os primeiros sistemas serviram
à indústria aeroespacial e automobilística e estavam baseados em estudos
matemáticos desenvolvidos nas décadas de 50 e 60. Estes sistemas eram
chamados de modeladores de superfície e eram computacionalmente caros
devido as restrições de hardware e algoritmos ainda não tão bem otimizados.
No fim dos anos 60, as pranchetas eram trocadas pelo monitor, através de
sistemas CAD que permitia a geração de linhas retas, arcos, além de acréscimo
de dimensões e informações sobre o objeto desenhado, podendo ainda a
impressão ser direcionada a uma ploter. Estes sistemas caracterizavam-se pela
representação dos objetos através de suas “vistas” (elevação, planta, lateral),
como na figura 4.1.

Computação Gráfica e Processamento de Imagem 38


Prof Kesede R Julio

Figura 4.1: Vistas de uma peça

Em meados de 70, informações de profundidade foram acrescidas às linhas,


podendo o computador gerar um objeto unificado, chamado de objeto semi-
tridimensional, desenhado por um conjunto de arestas no espaço.
A idéia foi logo generalizada e foram gerados os primeiros modelos
tridimensionais chamados de wireframe (fio de arame). Neste caso qualquer parte
do objeto poderia ser representada em qualquer ponto de vista e qualquer
projeção escolhida pelo usuário. Podemos ver um exemplo na Figura 4.2.

Computação Gráfica e Processamento de Imagem 39


Prof Kesede R Julio

Figura 4.2: Modelo Wireframe

Como este modelo era composto por um conjunto de arestas, dependendo da


complexidade do objeto e do ponto de vista do usuário, as arestas se confundiam
e ficava difícil a interpretação. Faltava as informações sobre as superfícies visíveis
e não-visíveis para tornar o objeto mais compreensível visualmente.
Daí surgiram os modeladores de sólidos, unindo as vantagens do wireframe e a
dos modeladores de superfície. Agora os modelos poderiam conter informações
sobre faces do objeto (superfícies e arestas) visíveis e escondidas, ou seja,
informações referentes as fronteiras do objeto, além de detalhes sobre suas
conectividades. Um grande ganho destes modelos é o calculo de volume, massa
momento de inércia, interferência entre componentes etc.
Uma grande barreira até hoje para a modelagem de sólidos é a tecnologia de
hardware e de software, que ainda são fatores limitantes para o bom desempenho
dos sistemas.
Este modelo permite, em princípio, o cálculo de qualquer propriedade geométrica
do objeto modelado gerada pela sua capacidade de distinguir superfície, interior e
exterior do objeto. Estes cálculos dependem da validação do objeto (o sólido deve
ser válido) que devem satisfazer as seguintes propriedades:

Computação Gráfica e Processamento de Imagem 40


Prof Kesede R Julio

Rigidez: transformações rígidas aplicadas sobre ele não podem modificar sua
forma.
Finitude: ocupar uma parte finita do espaço
Homogeneidade: não pode possuir objetos adendos a ele.
Determinismo da fronteira: a fronteira, o interior e o exterior do objeto devem ser
passíveis de descrição.
Finitude de descrição: um número finito de símbolos deve descrever o objeto.
Fechamento sobre operações: operações geométricas efetuadas sobre objetos
válidos devem resultar em um objeto válido.

Segundo Mortengen existem 6 métodos diferentes de modelagem: Wireframe,


Instanciamento primitivo, Varredura, Decomposição, Geometria Sólida Construtiva
(CSG-Constructive Solid Geometry), Fronteira (B-Rep ou Polygonal
Representation).

4.1 Wireframe
Este modelo é também conhecido como fio de arame. O grande problema
deste método é a representação de objetos complexos, onde o traçado de suas
linhas pode gerar interpretações ambíguas. Figura 4.2

4.2 Instanciamento Primitivo

A representação dos sólidos são gerados a partir da representação de sólidos


primitivos alterando-se os parâmetros.

Computação Gráfica e Processamento de Imagem 41


Prof Kesede R Julio

Figura 4.3: Modelo por Instanciamento Primitivo

4.3 Varredura
Neste modelo, o sólido é representado por uma região bidimensional e um vetor
diretor. O sólido é gerado pelo caminho feito pelo vetor diretor.

Figura 4.4: Modelagem por Varredura

4.4 Decomposição

Computação Gráfica e Processamento de Imagem 42


Prof Kesede R Julio

O sólido, neste modelo, é representado por um conjunto de sólidos primitivos que


são unidos por uma operação de colagem. Na Figura 4.5 podemos ver um modelo
por Decomposição utilizando a técnica de Enumeração exaustiva (conjunto de
sólidos primitivos todos de mesmo tamanho). Esta abordagem é aproximada, uma
vez que suas curvas são aproximadas.

Figura 4.5: Modelagem por Decomposição

4.5 GSC – Geometria Sólida Construtiva


A representação aqui é realizada por operações e transformações sobre sólidos
primitivos, ou seja, cone, cilindro, cubo e esfera para representar qualquer outro
objeto.
Aplicando transformações geométricas (rotação, translação e escala) e operações
booleanas (união, intersecção e diferença) sobre as formas primitivas podemos
construir quaisquer outras formas de representação.
Um grande problema deste método é o custo computacional, devido a grande
quantidade de intersecções (ray tracing) a serem calculadas. Além disso, alguns
objetos são impossíveis de serem representados apenas com primitivas. Abaixo
mostramos um exemplo desta representação em uma estrutura de árvore.

Computação Gráfica e Processamento de Imagem 43


Prof Kesede R Julio

Figura 4.6: Modelagem por GCS

4.6 Fronteira
Os objetos aqui são representados por um conjunto de faces de polígonos planos,
onde as fronteiras dos polígonos demarcam as curvas do objeto.

Computação Gráfica e Processamento de Imagem 44


Prof Kesede R Julio

Figura 4.7: Modelagem por Fronteira

Este é um método de representação muito utilizado nos sistemas gráficos atuais,


porém sua construção é complexa, uma vez que as curvas requerem muitas faces
para representá-las. O efeito de suavização pode ser feito através de
sombreamento e a sua renderização realizada através de programas embutidos
no hardware.

Computação Gráfica e Processamento de Imagem 45


Prof Kesede R Julio

5 Curvas e Superfícies

5 .1 Curvas

5.1.1 Conjunto de Pontos

Uma curva é representada, matematicamente, por um conjunto infinito de pontos.


Claro que esta representação infinita é impossível de ser descrita analiticamente,
portanto, um conjunto finitos de pontos deve ser escolhido para definir uma curva.
Enfim, uma curva é representada por uma sequência de pontos no plano
cartesiano (x, y). Exemplo: {(-2,8), (-1,3), (0,0), (1,-1), (2,0), (3,3), (4,8)}. Cada um
destes pontos representam a distância entre o ponto e a origem dos eixos x e y,
respectivamente. Resultados de experimentos se utilizam deste forma de
representação.

Dependendo da aplicação, apenas os pontos são suficientes para mostrar


satisfatoriamente os dados, porém se queremos representar uma curva

Computação Gráfica e Processamento de Imagem 46


Prof Kesede R Julio

geométrica e não pontos representativos de dados, precisaremos de mais pontos


quanto mais acentuada for a curva. Exemplo:

5.1.2 Bézier

Em meados de 1960, Pierre Bézier desenvolvendo um projeto para os automóveis


da Renault francesa, baseou suas curvas em pontos de controle, inclusive para o
cálculo da tangente dos pontos iniciais e finais. Os softwares mais populares do
mercado (Corel Draw, 3D Max, Auto CAD etc) se utilizam deste conceito para o
traçado de curvas.

A curva paramétrica de Bézier é definida por:


n
Pt =∑ B i J n , i t 0≤t≤1
i=0

Onde:
– Bi é cada um dos pontos de controle da curva
– Jn,i (t) são as funções de combinação (blending functions) que influenciam
todos os pontos de controle. Estas funções são definidas pelos polinômios
de Bernstein:

Computação Gráfica e Processamento de Imagem 47


Prof Kesede R Julio

J n , i t= n t i 1−tn−i
i
Onde: n é o grau dos polinômios e

n!
 n = i=0,1, ... n
i i ! n−i!

são os coeficientes binomiais. Estas funções devem satisfazer as condições:

J n , i t≥0 para todo i entre 0 e n, isto é, 0≤i≤n


e
n

∑ J n , i t=1, , 0≤t≤1
i=0

esta última condição força a curva permanecer dentro do polígono convexo


(convex hull) definido por todos os pontos de controle.

B2 B1 B2

B1 Curva
de
Bézier B0
B4
B5

B0 B3 B4 B3

Figura 5.4: Curva de Bézier contida no polígono formado pelos seus pontos de controle

Quando movemos qualquer ponto de controle na curva de Bézier, movemos toda


a curva, pois eles estão relacionados pelo polinômio de Bernstein. A esta
característica damos o nome de “controle global”. Isto pode ser prejudicial
quando queremos um ajuste fino na curva. Neste caso, teremos que aumentar o
número de pontos para um maior controle.
Quando aumentamos o número de pontos de uma curva, deixamos sua
expressão muito complexa. Uma solução para isto é a divisão em várias curvas
de menor grau. Neste caso, para que haja continuidade das curvas, devemos
definir três pontos em uma mesma reta, ou seja, a reta terá seus pontos extremos

Computação Gráfica e Processamento de Imagem 48


Prof Kesede R Julio

definidos pelo penúltimo ponto de uma das curvas e o segundo ponto da outra,
sendo o ponto do meio da reta coincidentes às duas curvas. Veja a figura abaixo.

B2

B3 B3
B2
B1
B4

B0
B0
B1

Figura 5.5: Curvas de menor grau conectadas

Podemos, como exemplo considerar o traçado de uma curva com três pontos de
controle: B0, B1 e B2.
Substituindo os polinômios de grau 2, na expressão da curva paramétrica de
Bézier, teremos:

Pt =B 0 J 2,0 t B 1 J 2,1 t B 2 J 2,2 t

Portanto, as funções de combinação (polinômios de Bernstein) seriam:

2! 0
J 2,0= t 1−t 2=1−t 2 =1−2tt 2
0!2!

2! 1
J 2,1= t 1−t 1=2t1−t =2t−2t2
1! 1!

2! 2
J 2,2= t 1−t 0=t 2
2!0!

assim, substituindo estes resultados na expressão da curva, teremos:

Pt =1−t2 B02t1−t B1t 2 B 2

Matricialmente, teremos:

Computação Gráfica e Processamento de Imagem 49


Prof Kesede R Julio

[]
B0
2 2
Pt =[1−t  2t 1−t  t ] B1
B2

podemos também separar t em uma matriz de potência, assim:

[ ][ ]
1 −2 1 B0
2
Pt =[t t 1] −2 2 0 B1
1 0 0 B2

Resumindo, poderíamos ter a seguinte representação:

Pt =T MB CB

Onde:
T é o vetor potência
MB são os coeficientes da matriz de Bézier
CB são os pontos de controle.

Computação Gráfica e Processamento de Imagem 50


Prof Kesede R Julio

6.Fundamentos de Cor

6.1 Conceitos Básicos

As cores nada mais são que frequências eletromagnéticas, porém não são
quaisquer frequências, uma vez que a grande maioria delas não são visíveis. Na
verdade, o que os olhos humanos conseguem ver é uma pequena faixa do
espectro de frequência eletromagnética conhecida. Esta faixa se localiza entre as
radiação infravermelha e ultravioleta. A cada espectro visível está associada uma
cor, variando entre o vermelho, passando pelo amarelo, verde, azul e chegando
ao violeta. As ilustrações abaixo mostram estas variações.

Quando temos emissão de uma fonte de luz branca (emissão de todas as


frequências do espectro visível), como o sol, por exemplo, parte desta luz é
refletida e parte é absorvida pelos objetos expostos. Caso a parte refletida tenha
dominância de alta frequência no escopo visível, dizemos que o objeto tem cor
vermelha; caso a dominância seja de baixa frequência dizemos que o objeto é de
cor violeta.
Podemos chamar as frequências dominantes refletidas de cor ou de matiz da luz.
As características da luz são determinadas pela sua matiz, brilho e saturação.
Usamos a matiz para dar nome a cor, o brilho é determinado pelo nível de
luminância de uma cor em relação a outra cor, e a saturação é o nível de pureza
de um determinada cor. As cores branca, preta e cinza tem saturação uniforme em
todos os comprimentos de onda e por isso, são diferenciadas apenas pelo seu

Computação Gráfica e Processamento de Imagem 51


Prof Kesede R Julio

brilho. A propriedade de cromaticidade é determinada pela saturação e pela matiz


da cor.

6.2.Sistemas de Cores Primárias


Quanto falamos de Sistema de Cor, estamos falando de cores primárias, ou seja,
cores que são utilizadas para visualizar outras cores. Existem vários sistemas de
cores primárias, porém falaremos apenas de dois deles: RGB (Red, Green, Blue)
e HSV (Hue, Saturation, Value). Chamamos de espaço de cor a área formada
pelas cores intermediárias das cores primárias de cada sistema.

6.2.1 RGB

Este sistema está baseado na teoria de Young-Helmholtz, que diz que a


percepção humana para cores acontece através da estimulação de 3 pigmentos
presentes nos cones da retina, os quais tem seus picos de sensibilidade nos
seguintes comprimentos de onda: 630 nm (Red), 530 nm (Green) e 450 nm (Blue).
Os monitores CRT se utilizam deste sistema. Este modelo é aditivo,o que significa
que a contribuição individual de cada cor deve ser somada para obtermos a cor
resultante.
O sistema RGB pode ser representado por um cubo unitário, onde a posição
(0,0,0) representa a cor preta, a posição (1,1,1) a cor branca e a reta diagonal
traçada entre estes dois pontos, os níveis de cinza.

Green=(0,1,0) Amarelo=(1,1,0)

Ciano=(0,1,1) branco=(1,1,1
)

preto=(0,0,0)
Red=(1,0,0)

Magenta=(1,0,1)
Blue=(0,0,1)
Níveis de
cinza

Computação Gráfica e Processamento de Imagem 52


Prof Kesede R Julio

6.2.2.HSV (Hue, Saturation, Value)

Neste sistema, a cor é definida pelo seu espectro combinado com a quantidade de
cor branca e de cor preta adicionados a ele. A representação do sistema é
realizada através de um cone de seis lados, derivado do cubo unitário RGB.

Luminância
Luminância=1
(branco) Verde Amarelo

Ciano Vermelho

Azul Magenta

Hue
(Matiz)
Luminância=0
(preto) Saturação

Computação Gráfica e Processamento de Imagem 53


Prof Kesede R Julio

7 Processamento de Imagem
Por muitos autores a área de Processamento de Imagem é uma sub-área da
Computação Gráfica, seja como for, está longe de perder a sua importância, uma
vez que o reconhecimento intuitivo das informações pelo olho humano é realizado
através de imagens. Processar a imagem significa manipular os valores que a
representam de forma a torná-la adequada aos seus objetivos. Muita manipulação
pode ser feita com imagens, porém precisamos antes de tudo entender o que é
imagem digital.

7.1 Representação Digital de Imagem

Qualquer imagem do mundo real é representada no espaço contínuo, quando


digitalizamos esta imagem devemos, obrigatoriamente, discretizar o espaço de
representação. À discretização do espaço ocupado pela imagem damos o nome
de Amostragem e à discretização da sua luminosidade damos o nome de
Quantização. Veremos cada um deles adiante. Uma imagem digital, portanto,
pode ser representada por uma matriz de dimensões definidas, onde cada
posição representa a discretização de uma área da imagem (pixel = picture
elements) e o valor atribuído a esta posição representa a discretização da
luminosidade naquele ponto. O canto superior esquerdo da matriz será o pixel
(0,0), que contem a intensidade de cor f(0,0). A origem da imagem se dará neste
pixel, ou seja, o eixo X começará neste ponto ponto e caminhará no sentido
horizontal para a direita, enquanto que o eixo Y, começará neste ponto e
caminhará no sentido vertical para baixo. Por exemplo, uma imagem em branco e
preto (binária) pode ser discretizada através de uma matriz 10x10, e a
representação da luminosidade em cada pixel por valores 0´s (preto) e 1´s
(branco).
(0,0) x
0 0 0 0 1 1 0 0 0 0
0 0 1 1 0 0 1 1 0 0
0 1 1 0 0 0 0 1 1 0
0 1 1 0 0 0 0 1 1 0
1 1 0 0 0 0 0 0 1 1
1 1 0 0 0 0 0 0 1 1
0 1 1 0 0 0 0 1 1 0
0 1 1 0 0 0 0 1 1 0
0 0 1 1 0 0 1 1 0 0
0 0 0 0 1 1 0 0 0 0
y

Computação Gráfica e Processamento de Imagem 54


Prof Kesede R Julio

A esta matriz poderíamos chamar de imagem binária, uma vez que apenas dois
valores são possíveis para representar a cor do pixel (1 bit de profundidade).
Poderíamos também representar uma imagem em 256 níveis de cinza (8 bits de
profundidade) onde cada número de 0 a 255 representaria na matriz uma
determinada intensidade de cinza da imagem. Por exemplo, poderíamos ter uma
imagem gradiente representada na matriz:

0 0 0 0 0 0 0 0 0 0
30 30 30 30 30 30 30 30 30 30
60 60 60 60 60 60 60 60 60 60
90 90 90 90 90 90 90 90 90 90
120 120 120 120 120 120 120 120 120 120
150 150 150 150 150 150 150 150 150 150
180 180 180 180 180 180 180 180 180 180
210 210 210 210 210 210 210 210 210 210
240 240 240 240 240 240 240 240 240 240
255 255 255 255 255 255 255 255 255 255

Para compreendermos melhor, vamos trabalhar com algumas imagens pequenas,


criadas por nós mesmos.

7.1.1 Laboratório

1. Crie e mostre uma matriz gradiente.

- Carregue o MatLab.
- Crie um vetor com os valores de 0 a 255, com passo de 1.
>> im=[0:1:255];
>> im
Caso você não coloque o ponto-e-vírgula o retorno é imediato. Neste caso, foi
criado uma matriz 1x256. Para gerar uma transposta de im, basta adicionar um
apóstrofo após o nome da matriz (im').

Computação Gráfica e Processamento de Imagem 55


Prof Kesede R Julio

Agora você deve criar uma matriz 256x256, repetindo os valores deste vetor nas
diversas linhas da matriz
>> im=repmat(im,256,1);
>> im
A função repmat() replica o primeiro argumento em cada posição da matriz
definida pelos argumentos 2 e 3. Desta forma, a matriz im é replicada em 256
linha, mas apenas em uma coluna. Como a matriz tem 256 colunas, logo teremos
como resultado uma matriz de 256x256.
Mostre a matriz
>> imshow(im, [])
A função imshow mostra o primeiro argumento como uma imagem. O segundo
argumento desta função permite assumir uma escala de cinza do menor até o
maior elemento do primeiro argumento.

2. Crie uma lista de -15 a 18, variando de 3 em 3.

>> a=[-15:3:18]
a=
-15 -12 -9 -6 -3 0 3 6 9 12 15 18

3. Modifique o vetor acima de forma que se torne uma matriz. Trabalhe com
ordens diferentes e faça comentários a respeito.

>> a34=reshape(a,3,4)
a34 =
-15 -6 3 12
-12 -3 6 15
-9 0 9 18
>> a43=reshape(a,4,3)
a43 =
-15 -3 9
-12 0 12
-9 3 15
-6 6 18
>> a26=reshape(a,2,6)

Computação Gráfica e Processamento de Imagem 56


Prof Kesede R Julio

a26 =
-15 -9 -3 3 9 15
-12 -6 0 6 12 18

4. Mostre, como imagem, cada uma das matriz geradas. Caso cada valor
apareça como um único pixel, utilize o parâmetro 'notruesize' na função
imshow

7.1.2 Relatórios

1) Crie e mostre duas imagens listradas (branco e preto), com tamanho mínimo de
50x50. Na primeira imagem, crie listras verticais e na segunda horizontais. Faça
comentários explicativos
2) Crie e mostre duas imagens xadrez (branco e preto), com tamanho mínimo de
50x50. Na primeira imagem, crie a primeira posição como preta e na segunda
imagem como branca. Faça comentários explicativos

7.2 Quantização

Como foi citado anteriormente temos em cada pixel o valor da luminosidade. A


variação dos valores deste atributo depende da profundidade de cor da imagem.
No caso de uma imagem binária, teríamos uma profundidade de cor de 1 bit
apenas. A tabela abaixo mostra a relação entre o número de cores e a quantidade
de bits de profundidade de cor da imagem.

Profundidade Nr de
(bits) cores
1 2
2 4
3 8
4 16
5 32
6 64
7 128
8 256

Computação Gráfica e Processamento de Imagem 57


Prof Kesede R Julio

Considerando que o espaço onde representamos a imagem é o plano (x, y),


podemos dizer que a intensidade de cor varia no eixo z (f(x,y)). Quando
quantizamos uma imagem discretizamos sua profundidade de cor. Isto significa
que uma imagem no espaço contínuo de cor pode ser representada no espaço
discreto de 256 cores (8 bits), que pode ser representada no espaço de cor de
128 (7 bits), e assim por diante. A consequência disso, será a redução da
representação das cores da imagem, pois teremos menos bits para representá-
las, consequentemente, perda de detalhes.
Na prática, existem vários métodos de quantização de imagens, uns mais, outros
menos eficientes, dependendo da distribuição das cores na imagem. Mostraremos
uma dessas formas. Podemos fazer a relação do valor do pixel da imagem com o
nr de cores que queremos, isto seria um processo de proporção. Assim:

valor do pixel atual valor do pixel quantizado


=
nr de cores atual nr de cores desejada

Através da função size() podemos identificar se estamos tratando com uma


imagem RGB (3 camadas) ou nível de cinza (1 camada).

>> f=imread('lenina.ppm');
>> size(f)

ans =

256 256 3

Para saber algumas informações a respeito da imagem, inclusive profundidade de


cor, podemos usar a função imfinfo() com o nome do arquivo da imagem como
parâmetro.
>> imfinfo('lenina.ppm')

ans =

Filename: 'lenina.ppm'
FileModDate: '01-Nov-2005 12:22:16'
FileSize: 196646
Format: 'PPM'

Computação Gráfica e Processamento de Imagem 58


Prof Kesede R Julio

FormatVersion: 'P6'
Width: 256
Height: 256
BitDepth: 24
ColorType: 'truecolor'
FormatSignature: 'P6'
Encoding: 'rawbits'
MaxValue: 255
ImageDataOffset: 38

Neste caso temos uma imagem de 3 camadas (frames) de 8 bits de profundidade


cada uma.
Neste laboratório o arquivo de imagem é RGB, apenas é visualizado como nível
de cinza. Logo, o valor do mesmo pixel em cada uma das camadas é o mesmo.
Por isso, eliminamos as camadas 2 e 3 (f(:,:,1)) afim de otimizar o algoritmo.

7.2.1 Laboratório

Em matlab, seria:
>> f=imread('lenina.ppm');
>> imshow(f(:,:,1));
>> f64=floor(double(f(:,:,1))*64/256);
>> imshow(f64,[]);
>> f8=floor(double(f(:,:,1))*8/256);
>> imshow(f8,[]);
>> f2=floor(double(f(:,:,1))*2/256);
>> imshow(f2,[]);

Computação Gráfica e Processamento de Imagem 59


Prof Kesede R Julio

imagem Original Imagem quantizada para 64 cores (6 bits)

Imagem quantizada para 8 cores (3 bits) Imagem quantizada para 2 cores (1 bit)

Note que na imagem de 6 bits não percebemos os níveis de quantização, na


imagem de 3 bits os níveis são percebidos e na imagem de 1 bit a percepção das
bordas de quantização é tão grande que perdemos a visualização da imagem. Ou
seja, este método de quantização não é eficiente para níveis muito baixos de
quantização.
Afim de minimizar o problema, foi proposto um método chamado Dithering (ou
algoritmo de meio-tom). O método toma por base que a percepção de detalhes
em uma imagem depende, basicamente, de 3 coisas: distância da imagem,
densidade de resolução da imagem e abertura do olho.
A indústria gráfica se utiliza deste método para fabricação de jornais e revistas. O
método consiste em aglomerar, ordenadamente ou não, os pixels de forma a gerar
ilusões de meio-tom ao olho humano. Quanto mais aglomerado os pixels pretos,
maior a ilusão de intensidade mais escura, e portanto quanto menor a densidade
dos pontos, maior a ilusão de intensidade mais clara. Exemplo:

Computação Gráfica e Processamento de Imagem 60


Prof Kesede R Julio

Vamos criar uma imagem binária da lenina usando dithering.


>> fd=dither(f(:,:,1));
>> imshow(fd);

Podemos notar que, apesar de termos apenas duas cores, ganhamos muito mais
detalhes visuais na imagem. Compare esta imagem com a quantização de duas
cores (imagem binária).

7.2.2 Relatórios

7.2.2.1 Faça os mesmos testes do laboratório anterior, agora com uma foto sua.
Os testes devem contemplar todos os níveis de quantização de 8 a 1 bit, assim
como a aplicação do dithering. Verifique em qual transição se dá a
perceptividade dos níveis de quantização. Faça comentários explicativos.

Computação Gráfica e Processamento de Imagem 61


Prof Kesede R Julio

7.3 Amostragem

Além do aumento ou diminuição dos níveis de cinza da imagem, a sua resolução,


como já foi citado, passa pela amostragem, ou seja, quantidade de pontos que
representam a imagem.Se temos uma imagem de 256x256 de 8 bits (256 níveis
de cinza), nem percebemos os efeitos da amostragem, porém ao diminuirmos a
quantidade de pontos para 128x128, ou 64x64, começamos a sentir falta de
pontos que representem pixels intermediários entre dois pontos.
Dependendo da aplicação da visualização da imagem, isto pode ser conveniente,
pois quanto menor a representação, menor o espaço ocupado e melhor
performance dos algoritmos que serão executados sobre esta imagem. A função
imresize(), permite-nos verificar este efeito de amostragem.

7.3.2 Laboratório

Leia a imagem original


>> f=imread('lenina.ppm');
Mostre a imagem
>> image(f);
Faça a amostragem da imagem original para 128x128
>> f128x128=imresize(f,[128 128]);
Mostre a imagem
>> image(f128x128);
Faça a amostragem da imagem original para 64x64
>> f64x64=imresize(f,[64 64]);
Mostre a imagem
>> image(f64x64);
Faça a amostragem da imagem original para 32x32
>> f32x32=imresize(f,[32 32]);
Mostre a imagem
>> image(f32x32);

Computação Gráfica e Processamento de Imagem 62


Prof Kesede R Julio

Imagem Original (256x256) Imagem amostrada (128x128)

Imagem amostrada (64x64) Imagem amostrada (32x32)

Pronto! Perceba que nas imagens amostradas existem bordas amostrais


evidentes.

7.3.2 Relatórios

7.3.2.1 Faça os mesmos testes do laboratório anterior, agora com uma foto sua.
Os testes devem contemplar até 4 níveis do tamanho da imagem. Verifique em
qual nível de amostragem se dá a perceptividade das bordas. Faça
comentários explicativos

Computação Gráfica e Processamento de Imagem 63


Prof Kesede R Julio

7.4.Histograma

Histograma é o gráfico das intensidades de uma imagem. Ou seja, através dele


podemos verificar como se distribui a intensidade de cada pixel na imagem. Cada
ponto deste gráfico representa a quantidade de pixels de uma determinada
intensidade, portanto, o eixo x deste gráfico indica a variação de intensidade e o
eixo y indica a quantidade de pixels. Através do histograma da imagem podemos
decidir sobre várias operações a serem realizadas e como realizar estas
operações. Um exemplo clássico é a melhora de contraste da imagem através da
equalização do seu histograma. Equalizar um histograma significa distribuir todas
as intensidades dos pixels da imagem entre os valores de intensidade máximo e
mínimo da própria imagem. Assim, temos:

Imagem original Histograma da imagem original

Imagem equalizada Histograma da imagem equalizada

Computação Gráfica e Processamento de Imagem 64


Prof Kesede R Julio

7.4.1 Laboratório

Leia e mostre a imagem original.


>> f=imread('lenina.ppm');
>> imshow(f);

Extraia o histograma da imagem e guarde em outra variável. Esta variável será um


vetor unidimensional. Mostre este vetor afim de certificar-se disto.
>> figure, imhist(f(:,:,1))
Note que os valores de intensidade da imagem não estão distribuídos de maneira
uniforme, ou seja, existem mais intensidades escuras que claras.
Agora, melhore o contraste desta imagem através da equalização de seu
histograma.
>> fhe=histeq(f(:,:,1));
>> figure, imshow(fhe);
>> figure, imhist(fhe);
Note que agora as intensidades dos pixels estão melhores distribuídas no range
de 0 a 255 e a imagem está mais clara, deixando os detalhes da imagem mais
nítidos

7.4.2 Relatórios

Refaça o laboratório, agora utilizando sua foto. O que você pode concluir pelo
histograma? A equalização melhora ou não a visualização de detalhes? Faça
comentários explicativos.

7.5.Thresholding

O thresholding (limiarização) é a forma mais simples de segmentação de uma


imagem. Claro que nem sempre é suficiente, porém é bastante utilizada quando
queremos binarizar uma imagem, afim de separar uma determinada área de
interesse do restante da imagem. Os valores de intensidade que estiverem acima
do limiar tornam-se brancos e os que estiverem abaixo pretos. O valor de
thresholding deve ser decidido de acordo com o nosso interesse, nem sempre a
média, por exemplo, é um bom thresholding. Existem várias técnicas para decidir

Computação Gráfica e Processamento de Imagem 65


Prof Kesede R Julio

o seu valor, no entanto, faremos apenas alguns testes para entender o seu
significado.

7.5.1 Laboratório

Leia e mostre a imagem


>>> f=imread('lenina.ppm');
>>> imshow(f)

Podemos converter a imagem de rgb para nível de cinza usando a função


rgb2gray(), assim como extrair a média das intensidades através da função
mean2(), que no caso da lenina é 61. Aplique o thresholding usando a média e
mostre a imagem.
>> fg=rgb2gray(f);
>> mean2(fg)
>> f61=fg>61;
>> imshow(f61)

Agora, aplicamos um limiar de 30.


>>> f30=fg>30;
>>> imshow(f30)

E agora de 90.
>>> f90=fg>90;
>>> imshow(f90)

Imagem original Imagem c/ Imagem c/ Imagem c/


trhesholding de 30 trhesholding de 61 trhesholding de 90

Computação Gráfica e Processamento de Imagem 66


Prof Kesede R Julio

(média)
Perceba que a imagem torna-se mais escura a medida que aumentamos o
thresholding. O melhor caso, pelo menos em termos de resgate das
características originais da imagem, é o valor médio, porém as vezes desejamos
destacar uma determinada particularidade, mais escura ou mais clara.
Podemos também usar vários valores de thresholding em uma única imagem,
caso queiramos separar objetos de luminosidade diferentes. Nisto o histograma
da imagem pode ser uma boa ferramenta de análise para sabermos como estão
distribuídas as intensidades dos objetos na imagem.

7.5.2 Laboratório

Primeiramente lemos a imagem do disco, guardamos na variável f e visualizamos


a imagem.

>> f=imread('keyb.pgm');
>> imshow(f)
Convertemos a imagem para nível de cinza.
>> f=rgb2gray(f);
Depois disto, extraímos o histograma da imagem.
>> figure,imhist(f);
podemos observar uma concentração de valores em torno dos intervalos 20-50 e
150-180 e também em torno do 255. Com isso, podemos entender que se
passarmos thresholding por estes valores, partes significativas da imagem poderá
ser destacada.
>> teclas=f>20 & f<50;
>> imshow(teclas)
claro que com alguns ajustes podemos melhorar aquilo que queremos destacar.
>> fundo=f>150 & f<180;
>> imshow(fundo)

Computação Gráfica e Processamento de Imagem 67


Prof Kesede R Julio

até mesmo intuitivamente podemos perceber que os valores 255 são os números
das teclas.
>> nr=f==255;
>> imshow(nr)

Imagem original Histograma Im. teclas fundo números


Orig

7.5.2 Relatório

Escolha uma imagem com, pelo menos, dois objetos (grãos de arroz e de milho,
por exemplo) separáveis pelo método visto no laboratório 7.5.2. Refaça o
procedimento do laboratório (usando o histograma para separar os objetos), agora
considerando esta imagem. Faça comentários explicativos sobre cada operação.

5.6 Filtros

A idéia de filtro (máscara, template etc) é executar uma operação sobre uma
imagem afim de modificá-la. Esta operação é realizada utilizando-se a vizinhança
de cada pixel da imagem, assim como uma matriz (máscara, geralmente 3x3) com
um pixel central determinado, o qual será a referência para a operação de cada
pixel da imagem. Os valores desta matriz é que definirá a imagem resultante. A
vizinhança de um pixel depende da abordagem da operação. Podemos ter
vizinhança 8 ou 4. Estes números definem a quantidade de pixels que serão
considerados na operação.
Exemplo:
Imagem
10 23 1 14
35 2 50 20
5 2 25 24

Computação Gráfica e Processamento de Imagem 68


Prof Kesede R Julio

9 11 32 7

Filtro
1 2 -1
1 2 -1
1 2 -1

A regra para o cálculo do pixel central é sempre a divisão da quantidade de


colunas por 2 e a divisão da quantidade de linhas por 2, arredondando para cima
as casas decimais. Logo, em um filtro de 3x3 teremos a posição (2,2) como
centro, em um de 4x4, continuamos com a posição (2,2) como centro, e assim por
diante. O fato é que normalmente usamos uma matriz quadrada de ordem ímpar
(3x3, 5x5, 7x7 etc) para usarmos como filtro. Uma vez que o pixel central do filtro
deve ser posicionado sobre cada pixel da imagem, a imagem ganha um contorno
de valor zero (zero-padding) para que os pixels da borda da imagem possam ser
processados. Assim, a imagem processada será:

0 0 0 0 0 0
0 10 23 1 14 0
0 35 2 50 20 0
0 5 2 25 24 0
0 9 11 32 7 0
0 0 0 0 0 0

A área cinza representa o filtro com seu centro localizado no primeiro pixel da
imagem. Dessa forma, a combinação linear a ser processada seria:
im(1,1)=1.0+2.0+(-1).0+1.0+2.10+(-1).23+1.0+2.35+(-1).2=65
Isto ocorrerá em cada posição da imagem, pois o filtro percorre seu centro
sobre cada pixel.
Em uma imagem real, a imagem resultante pode ganhar um contorno
indesejável que pode ser contornado através do parâmetro 'replicate' da função
imfilter do MatLab. Este parâmetro gera o contorno através da replicação dos
valores de borda da própria imagem.

10 10 23 1 14 14
10 10 23 1 14 14
35 35 2 50 20 20

Computação Gráfica e Processamento de Imagem 69


Prof Kesede R Julio

5 5 2 25 24 24
9 9 11 32 7 7
9 9 11 32 7 7

Através dos filtros podemos suavizar a imagem, eliminar ruídos, melhorar


contraste, detectar bordas ou mesmo realizar efeitos artísticos. Os filtros podem
ser classificados em passa-alta, passa-baixa e passa-faixa.
Os filtros passa-alta permitem que altas frequências (mudança brusca em valores
de pixels próximos) permaneçam na imagem, eliminado as baixas frequências.
Os filtros passa-baixa permitem que baixas frequências (pequena ou nenhuma
mudança em valores de pixels próximos) permaneçam na imagem, eliminado as
altas frequências.
Os filtros passa-faixa permitem que faixas de frequências permaneçam na
imagem, eliminado as que estiverem fora da faixa. Este tipo de filtro tem seu uso
bem específico.
Cada tipo de filtragem requer mudanças dos valores e tamanho dos filtros.
Mostramos abaixo alguns destes filtros.

Filtro de Média (passa-baixa)


Este tipo de filtro é construído atribuindo-se 1 para todos os coeficientes da
máscara e dividindo-se cada um deles pelo total de coeficientes. Quanto maior a
máscara maior a redução do contraste e a perda da definição da imagem. Por
exemplo, em uma máscara 3x3, seria:

[ ]
1 1 1 1
h= . 1 1 1
9
1 1 1

Filtro Gaussiano (passa-baixa)


Este filtro é uma aproximação digital da função gaussiana. É muito utilizado para
reduzir ruídos na imagem, pois preserva mais os contornos que o filtro de média.
Um exemplo de um filtro gaussiano seria:

[ ]
1 4 7 4 1
1 4 16 26 16 4
h= . 7 26 41 26 7
273
4 16 26 16 4
1 4 7 4 1

Computação Gráfica e Processamento de Imagem 70


Prof Kesede R Julio

Filtro Sobel (passa-alta)


A aplicação deste filtro permite realçar as bordas da imagem através de 2 filtros,
um horizontal, outro vertical. O objetivo disto é destacar altas frequências nos dois
sentidos. Os dois filtros, são:

[ ]
−1 −2 −1
hh= 0 0 0
1 2 1

[ ]
−1 0 1
hv= −2 0 2
−1 0 1

Além destes, diversos filtros poderiam ser construídos para aplicações diferentes.
O Matlab, através da função fspecial(<filtro>), permite a construção de vários
deles:
Filtro Descrição
'gaussian' Gaussiano
'sobel' Sobel com enfase horizontal
'prewitt' Prewitt com enfase horizontal
'laplacian' Laplaciano
'log' Laplaciano do filtro Gaussiano
'average' Média
'unsharp' Unsharp (aumento de contraste)

5.6.1 Laboratório

Vamos trabalhar primeiro com imagens pequenas para verificarmos melhor os


efeitos do filtro nos valores da imagem.
A função “magic” cria uma matriz quadrada de números aleatorios. Usaremos esta
função para simularmos nossa imagem.
>> im=magic(4)
Criamos agora um filtro h com valor negativo.
>> h=[-1 0 1]
Aplicamos o filtro a imagem.
>> imf=imfilter(im,h)

Computação Gráfica e Processamento de Imagem 71


Prof Kesede R Julio

Para que você confira seu entendimento, faça os cálculos na mão de pelo menos
um dos pixels e valide seus cálculos com o resultado do imfilter. Em uma imagem
real o tipo dos valores são considerados de forma que os valores negativos se
tornem zero e os valores acima do range do tipo seja truncado. Por exemplo, se a
imagem é uint8 e os resultados forem fracionários, os valores decimais serão
desconsiderados.
Leia a imagem do arquivo e mostre-a.
>> f=imread('cookies.pgm');
>> imshow(f)
Crie um filtro de média.
>> h=ones(3)/9
Aplique o filtro sobre a imagem
>>fh=imfilter(f,h)
Mostre as duas imagens em um mesmo figure.
>> subplot(1,2,1),imshow(f),title('Imagem Original'),...
subplot(1,2,2),imshow(fh),title('Imagem filtrada')

Im a g e m   O r ig in a l Im a g e m   fil t r a d a

Para processar imagens coloridas (rgb) basta usar a mesma metodologia. Neste
caso, o filtro é passado em cada canal de cor.

5.6.2 Relatórios

1. Faça laboratório acima (filtro de média) com uma imagem nível de cinza
(2D) e uma colorida (3D).

Computação Gráfica e Processamento de Imagem 72


Prof Kesede R Julio

2. Escolha uma imagem com ruído e detecte suas bordas. Aplique o filtro
Gaussiano e em seguida o filtro Sobel ou outro que melhor solucione seu
problema.

5.7 Morfologia Matemática

A morfologia pode ser aplicada para realce de imagens, esqueletização,


segmentação, filtragem etc. As operações morfológicas consistem na relação das
imagens com formas menores e especificamente definidas chamadas elemento
estruturante, através da teoria dos conjuntos. Temos duas operações morfológicas
principais: dilatação e erosão. A dilatação (União) acrescenta uma área na
imagem através de uma forma padrão (Elemento Estruturante). A erosão
(Intersecção) exclui da imagem formas que não atendam a um determinado
padrão (Elemento Estruturante). Estas operações podem ser realizadas sobre
imagens binárias, tons de cinza ou coloridas, porém em cada uma delas o
significado será diferente. Veremos apenas operações morfológicas em imagens
binárias e tons de cinza.

5.7.1 Dilatação

A dilatação sempre aumenta o tamanho da imagem, pois a operação realizada é


de União. Abaixo será mostrado o processo de dilatação binária.
B = {(0,0), (1,0)}

A marcação do primeiro pixel na imagem denota a origem da imagem e a


marcação do pixel no Elemento Estruturante denota o seu centro.

Computação Gráfica e Processamento de Imagem 73


Prof Kesede R Julio

5.7.2 Erosão

A erosão sempre diminui o tamanho da imagem, pois a operação realizada é de


intersecção. Abaixo será mostrado alguns exemplos de erosão.

O conjunto de pontos resultantes da erosão é a o conjunto de pontos que


interceptam totalmente A e B.

5.7.3 Abertura

Uma Abertura Morfológica é uma erosão seguida imediatamente de uma dilatação


com mesmo elemento estruturante. Ela tende a abrir pequenos espaços vazios
entre objetos da imagem muito próximos. Também pode ser usada para eliminar
ruídos na imagem. Veja o exemplo abaixo.

Computação Gráfica e Processamento de Imagem 74


Prof Kesede R Julio

5.7.4 Fechamento

Um Fechamento Morfológico é uma dilatação seguida imediatamente de uma


erosão com mesmo elemento estruturante. Ele tende a eliminar buracos na
imagem, ou seja, fecha espaços vazios. Também pode ser usada para eliminar
ruídos na imagem. Veja o exemplo abaixo.

5.7.5 Morfologia em Tons de Cinza

A idéia aqui se modifica um pouco devido aos valores da imagem. O que é União,
passa a ser o valor máximo. O que é Intersecção passa a ser o valor mínimo.
Abaixo estão algumas imagens nível de cinza onde foram aplicadas cada
operação morfológica vista.

5.7.6 Laboratório

Computação Gráfica e Processamento de Imagem 75


Prof Kesede R Julio

Vamos agora praticar o uso das ferramentas morfológicas.


Comecemos pela dilatação. Leia a imagem text.png.
>> textobw = imread('text.png');

Agora crie um EE de linha vertical (90º) de tamanho de 22 pixels.


>> ee = strel('line',11,90);

Use o EE criado para dilatar a imagem e mostre a imagem original e a dilatada.


>> textobw2 = imdilate(textobw,ee);
>> imshow(textobw), title('Original')
>> figure, imshow(textobw2), title('Dilatado')

O rig in a l D ila t a d o

Faça uma dilatação com a imagem cameraman.tif. Leia a imagem.


>> fotografo = imread('cameraman.tif');

Crie um EE de uma bola de raio 5.


>> ee = strel('ball',5,5);

Faça a dilatação da imagem usando o EE criado.


>> fotografo2 = imdilate(fotografo,ee);

Mostre as duas imagens (original e dilatada).


>> imshow(fotografo), title('Original')
>> figure, imshow(fotografo2), title('Dilatada')

Computação Gráfica e Processamento de Imagem 76


Prof Kesede R Julio

O rig in a l D ila t a d a

Perceba que a imagem ficou mais claro, pois cada pixel da imagem visitado pelo
centro do elemento estruturante, assumiu o maior valor de sua vizinhança
(considerada pela forma do EE).

Agora faremos uma erosão em uma imagem binária e depois em uma tom de
cinza.
Leia a imagem binária circles.png e mostre-a.
>> circulosBW = imread('circles.png');
>> imview(circulosBW)
Perceba que os círculos estão sobrepostos. A função imview() é uma outra forma
de mostrar imagens (experimente as ferramentas da janela).
Vamos agora construir o Elemento Estruturante através da função strel(). Neste
caso, é construído um disco de 11 pixels de raio. (Acesse o help do Matlab para
verificar as diversas possibilidades de construção do EE através do strel()). Você
não precisa, necessariamente, usar o strel(). Você pode construir seu EE através
de uma matriz qualquer.
ee = strel('disk',11);

Vamos agora, erodir a image e mostrá-las (original e erodida) para comparação.


circErodBW = imerode(circulosBW,ee);
imview(circulosBW), imview(circErodBW)

Perceba que agora temos os círculos separados, o que facilita muito uma eventual
análise destes objetos.

Computação Gráfica e Processamento de Imagem 77


Prof Kesede R Julio

Imagem (binária) original Imagem Erodida

Experimente agora erodir uma imagem nível de cinza utilizando o script abaixo:
fotografo= imread('cameraman.tif');
ee = strel('ball',5,5); % constrói uma bola de raio 5
fotografo2 = imerode(fotografo,ee);
imshow(fotografo), title('Original')
figure, imshow(fotografo2), title('Erodida')

O rig in a l E ro d id a

Este script pode ser colocado dentro de arquivo .m e executado a partir do prompt
do matlab. Faça isto.
Perceba que a imagem ficou mais escura, pois cada pixel da imagem visitado pelo
centro do elemento estruturante, assumiu o menor valor de sua vizinhança
(considerada pela forma do EE).

5.8 Estudo de Casos

Computação Gráfica e Processamento de Imagem 78


Prof Kesede R Julio

Aqui estaremos listando algumas aplicações práticas de processamento de


imagens. A idéia é que você possa utilizar as ferramentas aqui descritas para as
suas próprias aplicações.

5.8.1 Análise de grãos de arroz

Primeiramente vamos ler a imagem do disco e mostrá-la em tela. Através do seu


tamanho (size), podemos constatar ser uma imagem nível de cinza.
>> arroz=imread('rice.png');
>> imshow(arroz)
>> size(arroz)
Devido ao fundo da imagem ser irregular, podemos aplicar uma subtração do
fundo afim de equalizá-lo. Primeiramente, criaremos uma imagem sem os grãos
de arroz através de uma abertura morfológica.
>> fundo = imopen(arroz,strel('disk',15));
>> figure, imshow(fundo)

A função strel(), neste caso, cria uma imagem em forma de um disco de raio de 15
pixels. Este disco deve ser maior que os grãos, de tal forma que não consiga ser
colocado totalmente dentro de nenhum deles. Desta forma removemos os grãos
de arroz conforme mostra a imagem.
Agora podemos subtrair o fundo da imagem original, ficando assim os grãos de
arroz sobre uma superfície totalmente preta.
>> arroz2 = imsubtract(arroz,fundo);
>> figure, imshow(arroz2)

Podemos então melhorar o contraste desta imagem, usando a função imadjust().


>> arroz3 = imadjust(arroz2);
>> figure, imshow(arroz3)
Apesar de estar bem destacado o que queremos (grãos de arroz), ainda temos
uma imagem nível de cinza. Podemos agora binarizar esta imagem usando
thresholding. A função graythresh() calcula um valor apropriado para fazer a
conversão de nível de cinza para binário. A função im2bw() binariza uma imagem
nível de cinza considerando o valor do limiar.
>> limiar = graythresh(arroz3);
>> arrozbw = im2bw(arroz3,limiar);
>> figure, imshow(arrozbw)

Computação Gráfica e Processamento de Imagem 79


Prof Kesede R Julio

Na imagem binarizada podemos aplicar a função bwlabel() que contará quantos


componentes existem na imagem (numObjects), além de rotular numericamente
(arrozRot), cada um dos componentes. Estes resultados dependerão de alguns
fatores, como: 1) tamanho dos componentes; 2) componentes que se tocam
formando um único componente; 3) tipo de conectividade, neste caso, 4.
>> [arrozRot,numObjetos] = bwlabel(arrozbw,4);
>> numObjetos
numObjetos =
101

Isto mostra que temos 101 grãos de arroz na imagem. A imagem pode ser vista
através da visualização de cores sintéticas para cada componente usando
label2rgb().
>> pseudo_color = label2rgb(arrozRot, @spring, 'c', 'shuffle');
>> imshow(pseudo_color);

Abaixo podemos ver as imagens geradas pela função imshow() resultante de cada
uma das operações vistas até aqui.

Computação Gráfica e Processamento de Imagem 80


Prof Kesede R Julio

Imagem original Remoção dos grãos de Imagem com fundo Melhora de contraste
(imread()) arroz (imopen()) regular (imsubtract()) (imadjust())

Imagem binarizada Imagem colorida


(imbw()) sinteticamente
(label2rgb())

Além de contar componentes, podemos também extrair algumas informações


destes componentes, através da função regionprops(), que retornará em uma
estrutura, a área (em pixels), o centro de massa e o retângulo que envolve
(bounding box) cada um dos componentes.

>> arrozDados = regionprops(arrozRot,'basic')


arrozDados =
101x1 struct array with fields:
Area
Centroid
BoundingBox

Assim, para sabermos o valor da área do 10º componente da imagem, seu


centroid e o retângulo que o envolve, usamos:
>>arrozDados(10).Area
ans =
176
>> arrozDados(10).BoundingBox

Computação Gráfica e Processamento de Imagem 81


Prof Kesede R Julio

ans =
9.5000 86.5000 25.0000 17.0000
>> arrozDados(10).Centroid
ans =

21.3693 95.9716

Dado o valor da área de cada componente (arrozDados.Area), algumas questões


estatísticos podem ser levantadas, como:
Qual o tamanho do maior grão?
>> max([arrozdados.Area])
ans =
404

Qual o grão de maior tamanho?


>> maiorgrao = find([graindata.Area]==404)
maiorgrao =
59
Qual a média dos tamanhos dos grãos?
>> mean([graindata.Area])
ans =
175.0396

5.9 Reconhecimento de Padrões

O reconhecimento de Padrões de imagem sugere a identificação de padrões ou


objetos dentro de uma determinada imagem. As técnicas envolvidas permitem a
classificação dos objetos determinando sua separabilidade.
Um sistema de RP deveria ser capaz de extrair informações a partir de um
conjunto de informações irrelevantes, aprender por exemplos e generalizar o
conhecimento para outros contextos, inferir informações a partir de informações
incompletas. Sabemos que nossa inteligência tem esta capacidade, porém para
um computador a tarefa fica mais difícil. Estas dificuldades acabam por gerar
sistema super-especialistas.

Computação Gráfica e Processamento de Imagem 82


Prof Kesede R Julio

Podemos dividir a tarefa de identificação em processamento de três níveis: baixo,


médio e alto.
No nível baixo temos a captura da imagem (fotografia, escaneamento, imagem por
satélite etc) através de um sensor e um pré-processamento na imagem (contraste,
ruído, ajustes etc) para melhorar a performance do sistema.
No nível médio podemos aplicar processos de separação das áreas de interesse
(segmentação), assim como determinar sua representação (vetor, árvore etc).
Esta fase pode exigir alguma inteligência do sistema, como por exemplo,
encontrar picos, texturas etc.
Já em alto nível temos efetivamente o processo de reconhecimento através de
comparação com padrões pré-estabelecidos ou não (sistemas autômatos). Aqui
os resultados são interpretados e mostrados ao usuário que poderá aplicar uma
validação para garantir a implantação ou não do sistema. A inteligência do sistema
nesta fase é fortemente exigida, uma vez que quanto menos aplicada, menos
automático será o reconhecimento.
A figura abaixo mostra uma estrutura básica de RP.

Nível Médio

Segmentação Representação

Pré-processamento
Base de conhecimento Resultado
Reconhecimento
Problema
Captura da imagem

Nível Baixo Nível Alto

Computação Gráfica e Processamento de Imagem 83