1. Prof Kesede R Julio
Prof Kesede R Julio
kesedejulio@gmail.com
Apostila de
Computação Gráfica
e
Processamento de Imagem
Campinas – SP - Brasil
Computação Gráfica e Processamento de Imagem 1
2. 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
3. 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
4. Prof Kesede R Julio
Espaço – Restart
P - Pause
Ação Nave
Gorda
Nave Magra
Atira
Acelera
Gira sentido horário
Gira sentido anti-
horário
V
C
X
Z
.
,
M
N
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
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
5. 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
totalmente computadorizado
Toy Story – 1995 – Primeira animação longa-
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
6. 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
Computação Gráfica e Processamento de Imagem 6
Modelagem
Geométrica
Síntese de
Imagens
Análise de
Imagens
Processamento de
Imagens
DADOS
IMAGENS
Computação
Gráfica
Visão
Computacional
7. 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
8. 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
9. 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:
0 ≤ ndcx ≤ 1
Computação Gráfica e Processamento de Imagem 9
10. Prof Kesede R Julio
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
ndcx = (x-xmin) / (xmax-xmin)
ndcy = (y-ymin) / (ymax-ymin)
Computação Gráfica e Processamento de Imagem 10
11. Prof Kesede R Julio
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
12. 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.
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
Ilustração 2Reflexão sem deformaçãoIlustração 1Eixos de Simetria
13. 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
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 (0o
< 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
x
y
x1
x2
y1
y2
14. 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
15. 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
16. 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<<"nn";
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
17. 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
18. 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
19. 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
20. 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
21. 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
22. 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 xi 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.
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
(Ponto Médio) em relação a I (ponto de intersecção da próxima vertical com a reta
Computação Gráfica e Processamento de Imagem 22
NE
P=(xp
,yp
) E
M
I
xp
+1xp
yp
yp
+1
23. Prof Kesede R Julio
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=axb ,
sendo a=
dy
dx
e dy=y2−y1
e dx=x2−x1
Substituindo na equação temos:
y=
dy
dx
xb
Agora podemos igualar esta equação a zero, assim:
y=
dy
dx
x+ b
y=
dy⋅x
dx
+ b (multiplicaçãoda fração por x/1)
y=
dy⋅x+ b⋅dx
dx
(divide pelo denominador e multiplica pelo numerador)
dx⋅y=dy⋅x+ b⋅dx (transportao dx paraa esquerda)
dy⋅x−dx⋅y+ b⋅dx=0 (iguala aequação a zero)
Agora, considere a equação implícita da reta:
Através da equação da reta em função de sua inclinação, conseguimos os termos
da equação implícita, assim:
Logo,
Computação Gráfica e Processamento de Imagem 23
Fx , y=axbyc=0
F (x , y)=dy⋅x−dx⋅y+b⋅dx=0
a=dy
b=−dx
c=b⋅dx
24. 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(xp+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,
dnovo=F xp2, y p
1
2
=axp2b yp
1
2
c
e
danterior=axp1b yp
1
2
c
Subtraindo danterior de dnovo obtemos a diferença incremental ΔE.
axp2abyp
1
2
bc
−
axp aby p
1
2
bc
=
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,
dnovo=F xp2, y p
3
2
=axp2b yp
3
2
c
e
Computação Gráfica e Processamento de Imagem 24
25. Prof Kesede R Julio
danterior=axp1b yp
1
2
c
Subtraindo danterior de dnovo obtemos a diferença incremental ΔNE.
axp2abyp
3
2
bc
−
axp aby p
1
2
bc
=
ab
Δ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 (x1, y1) é um ponto da reta,
podemos então calcular o dinicial para escolha do primeiro E ou NE. Então,
FM =dinicial=axp1by p
1
2
c=
=axpabyp
b
2
c=
=axpbypca
b
2
=
= Fxp , ypa
b
2
=
=a
b
2
Também afim de eliminar a fração multiplicamos por 2, e portanto,
dinicial =2ab=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:
Fx , y=x
2
y
2
−R
2
Computação Gráfica e Processamento de Imagem 25
26. Prof Kesede R Julio
Trataremos do traçado da circunferência apenas para o segundo octante (
0≤x≤R⋅ 2e R≥y≤R 2 ), todos os demais pontos poderão ser traçados por
simetria.
Neste caso, dado um ponto Pxp , yp , 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
médio está em 1, R−
1
2
. Substituindo este ponto da equação, temos:
F1, R−
1
2
=1R
2
−R
1
4
−R
2
=
5
4
−R
2
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:
danterior=F xp1, yp−
1
2
=xp1
2
yp−
1
2
2
−R
2
dnovo=F xp2, y p−
1
2
=xp2
2
yp−
1
2
2
−R
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
SE
E
M
P=(xp
,yp
)
xp xp
+1
yp
yp
-1
27. Prof Kesede R Julio
danterior=xp1
2
− = xp
2
2xp 11
2
− = xp
2
2xp1−
dnovo =xp2
2
− = xp
2
2xp 22
2
− = xp
2
4xp4−
ΔE=2xp3
Caso SE seja escolhido, temos:
dnovo=F xp2, y p−
3
2
=xp22
yp−
3
2
2
−R2
Desta forma, fazendo a subtração com o danterior , teremos ΔSE. Como os
terceiros termo 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:
danterior=xp1
2
yp−
1
2
2
−=
xp1
2
yp
2
−2⋅y p⋅
1
2
1
2
2
− =
x p1
2
yp
2
− yp
1
4
−
dnovo = x p2
2
y p−
3
2
2
− =
xp2
2
yp
2
−2⋅yp⋅
3
2
3
2
2
− =
x p2
2
yp
2
−3yp
9
4
−
ΔE=2xp3−2y p2=2xp−2yp5
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
28. 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
29. Prof Kesede R Julio
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 sy]⋅
[x
y]
Aplicando um fator sx=0.5 e sy=1.5 no objeto abaixo, teríamos:
3.1.3 Rotação
Computação Gráfica e Processamento de Imagem 29
(4,2)(1,2)
(2.5, 5)
x
y
Objeto na Posição inicial
(2,4)
(3.5, 7)
x
y
Objeto Transladado
(5,4)
(4,2)(1,2)
(2.5, 5)
x
y
Objeto na Posição inicial
(1.25, 7.5)
x
y
Objeto Escalonado
(0.5,3) (2,3)
30. 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' ]=[cos −sen
sen cos ]⋅[x
y]
Aplicando uma rotação de 45o
positivos no objeto abaixo, teremos a seguinte
transformação:
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
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:
Computação Gráfica e Processamento de Imagem 30
(4,2)(1,2)
(2.5, 5)
x
y
Objeto na Posição inicial
x
y
Objeto Rotacionado
(-1.1, 1.9 )
(-2.9, 4.7 )
(0.3, 4.4 )
31. Prof Kesede R Julio
>> 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
5 5 3
Computação Gráfica e Processamento de Imagem 31
32. Prof Kesede R Julio
>> 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
0 1.5000
Computação Gráfica e Processamento de Imagem 32
33. Prof Kesede R Julio
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
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.
Computação Gráfica e Processamento de Imagem 33
34. Prof Kesede R Julio
>> 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:
T =
[
tx
ty
tz]
Computação Gráfica e Processamento de Imagem 34
35. Prof Kesede R Julio
Escala:
S=
[
sx 0 0
0 sy 0
0 0 sz]
Rotação:
R=
[
cos −sen 0
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):
R=
[
cos −sen 0
sen cos 0
0 0 1]
Sobre o eixo x (no plano yz):
R=
[
1 0 0
0 cos −sen
0 sen cos ]
Sobre o eixo y (no plano xz):
R=
[
cos 0 −sen
0 1 0
sen 0 cos ]
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.
Computação Gráfica e Processamento de Imagem 35
36. Prof Kesede R Julio
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
P'=T⋅P
[
x'
y '
1 ]=
[
1 0 tx
0 1 ty
0 0 1 ]⋅
[
x
y
1]
Escala: P’ = S * P
P'=S⋅P
[
x'
y'
1 ]=
[
sx 0 0
0 sy 0
0 0 1]⋅
[
x
y
1]
Rotação: P’ = R * P
P'=R⋅P
[
x'
y '
1 ]=
[
cos −sen 0
sen cos 0
0 0 1]⋅
[
x
y
1]
Computação Gráfica e Processamento de Imagem 36
37. Prof Kesede R Julio
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 45o
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
38. 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
39. Prof Kesede R Julio
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
Figura 4.1: Vistas de uma peça
40. Prof Kesede R Julio
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
Figura 4.2: Modelo Wireframe
41. 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
42. Prof Kesede R Julio
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.
4.4 Decomposição
Computação Gráfica e Processamento de Imagem 42
Figura 4.3: Modelo por Instanciamento Primitivo
Figura 4.4: Modelagem por Varredura
43. 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.
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
Figura 4.5: Modelagem por Decomposição
44. Prof Kesede R Julio
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
Figura 4.6: Modelagem por GCS
45. Prof Kesede R Julio
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
Figura 4.7: Modelagem por Fronteira
46. 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
47. 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:
Pt =∑
i=0
n
Bi J n, it 0≤t≤1
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:
J n, it=
n
i
t
i
1−t
n−i
Computação Gráfica e Processamento de Imagem 47
48. Prof Kesede R Julio
Onde: n é o grau dos polinômios e
n
i
=
n!
i !n−i!
i=0,1,...n
são os coeficientes binomiais. Estas funções devem satisfazer as condições:
J n, it≥0 para todo i entre 0 e 1, isto é, 0≤i≤1
e
∑
i=0
n
J n, it=1, , 0≤t≤1
esta última condição força a curva permanecer dentro do polígono convexo
(convex hull) definido por todos os 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
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.
Computação Gráfica e Processamento de Imagem 48
Figura 5.4: Curva de Bézier contida no polígono formado pelos seus pontos de controle
B1
B0
B2
B3
B4
Curva
de
Bézier
B1
B0
B2
B3
B4
B5
49. Prof Kesede R Julio
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:
Pt =B0 J 2,0t B1 J 2,1t B2 J 2,2t
Portanto, as funções de combinação (polinômios de Bernstein) seriam:
J 2,0=
2!
0!2!
t
0
1−t
2
=1−t
2
=1−2tt
2
J 2,1=
2!
1! 1!
t1
1−t 1
=2t1−t =2t−2t2
J 2,2=
2!
2!0!
t
2
1−t
0
=t
2
assim, substituindo estes resultados na expressão da curva, teremos:
Pt =1−t
2
B02t1−t B1t
2
B2
Matricialmente, teremos:
Pt =[1−t
2
2t1−t t
2
]
[
B0
B1
B2
]
podemos também separar t em uma matriz de potência, assim:
Computação Gráfica e Processamento de Imagem 49
Figura 5.5: Curvas de menor grau conectadas
B1
B0
B2
B3
B4
B0
B1
B2
B3
50. Prof Kesede R Julio
Pt =[t2
t 1]
[
1 −2 1
−2 2 0
1 0 0][
B0
B1
B2
]
Resumindo, poderíamos ter a seguinte representação:
Pt =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
51. 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
52. 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.
Computação Gráfica e Processamento de Imagem 52
Red=(1,0,0)
Blue=(0,0,1)
Green=(0,1,0)
branco=(1,1,1
)
preto=(0,0,0)
Níveis de
cinza
Ciano=(0,1,1)
Amarelo=(1,1,0)
Magenta=(1,0,1)
53. 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.
Computação Gráfica e Processamento de Imagem 53
Vermelho
AmareloVerde
Ciano
Azul Magenta
Luminância
Saturação
Hue
(Matiz)
Luminância=0
(preto)
Luminância=1
(branco)
54. 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 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
Computação Gráfica e Processamento de Imagem 54
x
y
(0,0)
55. 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
56. 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
57. 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
(bits)
Nr de
cores
1 2
2 4
3 8
4 16
5 32
6 64
7 128
8 256
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
Computação Gráfica e Processamento de Imagem 57
58. Prof Kesede R Julio
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:
valordo pixelatual
nr decores atual
=
valor do pixel quantizado
nr decores 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'
FormatVersion: 'P6'
Width: 256
Computação Gráfica e Processamento de Imagem 58
59. Prof Kesede R Julio
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
60. 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
61. 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
62. 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
63. 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
64. 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
65. 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
o seu valor, no entanto, faremos apenas alguns testes para entender o seu
significado.
Computação Gráfica e Processamento de Imagem 65
66. Prof Kesede R Julio
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/
trhesholding de 30
Imagem c/
trhesholding de 61
(média)
Imagem c/
trhesholding de 90
Perceba que a imagem torna-se mais escura a medida que aumentamos o
thresholding. O melhor caso, pelo menos em termos de resgate das
Computação Gráfica e Processamento de Imagem 66
67. Prof Kesede R Julio
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)
até mesmo intuitivamente podemos perceber que os valores 255 são os números
das teclas.
>> nr=f==255;
>> imshow(nr)
Computação Gráfica e Processamento de Imagem 67
68. Prof Kesede R Julio
Imagem original Histograma Im.
Orig
teclas fundo números
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
9 11 32 7
Filtro
1 2 -1
1 2 -1
1 2 -1
Computação Gráfica e Processamento de Imagem 68
69. Prof Kesede R Julio
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
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.
Computação Gráfica e Processamento de Imagem 69
70. Prof Kesede R Julio
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:
h=
1
9
.
[
1 1 1
1 1 1
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:
h=
1
273
.
[
1 4 7 4 1
4 16 26 16 4
7 26 41 26 7
4 16 26 16 4
1 4 7 4 1
]
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:
hh=
[
−1 −2 −1
0 0 0
1 2 1 ]
Computação Gráfica e Processamento de Imagem 70
71. Prof Kesede R Julio
hv=
[
−1 0 1
−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)
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.
Computação Gráfica e Processamento de Imagem 71
72. Prof Kesede R Julio
>> 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 rig in a l Im a g e m filt ra 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).
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
Computação Gráfica e Processamento de Imagem 72
73. Prof Kesede R Julio
(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.
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.
Computação Gráfica e Processamento de Imagem 73
74. Prof Kesede R Julio
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.
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.
Computação Gráfica e Processamento de Imagem 74
75. Prof Kesede R Julio
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
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')
Computação Gráfica e Processamento de Imagem 75
76. Prof Kesede R Julio
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')
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).
Computação Gráfica e Processamento de Imagem 76
O r ig in a l D ila t a d o
D ila t a d aO r ig in a l
77. Prof Kesede R Julio
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.
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
Computação Gráfica e Processamento de Imagem 77
78. Prof Kesede R Julio
fotografo2 = imerode(fotografo,ee);
imshow(fotografo), title('Original')
figure, imshow(fotografo2), title('Erodida')
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
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)
Computação Gráfica e Processamento de Imagem 78
O r ig in a l E r o d id a
79. Prof Kesede R Julio
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)
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);
Computação Gráfica e Processamento de Imagem 79
80. Prof Kesede R Julio
Abaixo podemos ver as imagens geradas pela função imshow() resultante de cada
uma das operações vistas até aqui.
Imagem original
(imread())
Remoção dos grãos de
arroz (imopen())
Imagem com fundo
regular (imsubtract())
Melhora de contraste
(imadjust())
Imagem binarizada
(imbw())
Imagem colorida
sinteticamente
(label2rgb())
Computação Gráfica e Processamento de Imagem 80
81. Prof Kesede R Julio
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
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:
Computação Gráfica e Processamento de Imagem 81
82. Prof Kesede R Julio
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.
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
Computação Gráfica e Processamento de Imagem 82
83. Prof Kesede R Julio
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.
Computação Gráfica e Processamento de Imagem 83
Pré-processamento
Captura da imagem
Segmentação Representação
Base de conhecimento
Reconhecimento
Nível Baixo
Nível Médio
Nível Alto
Problema
Resultado