You are on page 1of 85

Prof Kesede R Julio

Prof Kesede R Julio
kesedejulio@gmail.com

A C P

postila de

omputação e

G

ráfica

rocessamento de magem

I

versão 2011

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 Atira Acelera Gira sentido horário Gira sentido horário Nave Gorda V C X Nave Magra . , M N

anti- Z

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

1990-2000 :.Prof Kesede R Julio IBM PC™ (Personal Computer). The predecessor of the current personal computers and progenitor of the IBM PC compatible hardware platform. it was introduced in August 1981. It was created by a team of 12 engineers and designers under the direction of Don Estridge of the IBM Entry Systems Division. Toy Story(EUA)). Men in Black etc). is a trade mark of IBM. Independence Day. The introduction of the PC changed the world of IBM in 1981.Grandes produções cinematográficas usando CG (Jurrassic Park. Computação Gráfica e Processamento de Imagem 5 . The original model was designated the IBM 5150. Godzilla. Primeiro longa-metragem de animação digital (Cassiopéia (Brasil).

Biometria. Biometria.Primeiro longa-metragem Toy Story – 1995 – Primeira animação longatotalmente computadorizado metragem totalmente computadorizada feita pela Disney. O uso de biometria digital na Disney World. Aki Ross é a atriz digital do filme “Final Fantasy” produzido em 2001. usaram massas como modelos. Computação Gráfica e Processamento de Imagem 6 . Dr.Tendência na produção de “atores digitais” (Aki Ross em Final Fantasy). 2000-atual :. Atores Digitais. RV. Ela é a primeira atriz fotorealística gerada por computador.Prof Kesede R Julio Cassiopédia – 1992 . Diferentemente do Cassiopéia.

1. as possibilidades. Indo desde a área médica. apenas os pontos que representarão a figura são acessados.4Dispositivos Gráficos Os dispositivos gráficos se dividem em dois: Vetorial e Matricial. como: medicina.Contextualização Modelagem Geométrica Visão Computacional Análise de Imagens DADOS Síntese de Imagens Computação Gráfica IMAGENS Processamento de Imagens 1. passando pelo entretenimento e chegando as indústrias. simulação visual. animação digital.2.y) para o desenho das figuras. Este processo se utiliza de um “Display List” armazenado na memória.Prof Kesede R Julio Realidade Virtual. multimídia na web etc 1.3Aplicações As aplicações de CG são inúmeras e eu diria até infinitas. o qual armazena todos os comandos e informações (coordenadas x. ou seja. O Computação Gráfica e Processamento de Imagem 7 . que significa que os desenhos são apresentados aleatoriamente. O modelo de uma rua da cidade de Nova York. Podemos citar algumas destas aplicações. Os Vetoriais se utilizam de um tipo de varredura chamada “Randon Scan”.

ficando muito mais fácil a execução do refresh. afim de executar o “refresh” e manter a figura sendo exibida por mais tempo. onde todas as posições endereçaveis do dispositivo são percorridas (de cima para baixo e da esquerda para direita). principalmente quando fora dos eixos simétricos. estes dispositivos se tornaram populares com o evento dos computadores domésticos em meados de 1980. Apesar deste problema. por isso não há “Display List”. Abaixo vemos um exemplo do desenho de um triângulo. Um grande problema deste tipo de dispositivo é o desenho de linhas. Todo o display é armazenado através de uma matriz de pixels (pontos do video) em um frame buffer (memória de video). Computação Gráfica e Processamento de Imagem 8 . devido a grande redução de custo das memórias e apesar dos dispositivos Randon Scan terem melhor resolução que os Raster Scan. Já os Matriciais se utilizam de uma técnica de rastreamento chamada “Raster Scan”. 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. por isso esta lista (Display List) deve ser acessada várias vezes. A medida que há o rastreamento a figura é desenhada nas posições onde se encontram.Prof Kesede R Julio principal problema destes dispositivos é que a permanencia da figura é de aproximadamente 40 microsegundos apenas. É quase impossível para estes dispositivos o preenchimento de áreas. A figura abaixo mostra um exemplo de Raster Scan.

Resolução Horizontal -> ResHoriz = NDH/WIDTH 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 Computação Gráfica e Processamento de Imagem 9 . 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.Prof Kesede R Julio A qualidade de um dispositivo raster é dada por vários fatores inerentes as suas dimensões físicas e gráficas. Ao número de pontos endereçáveis na vertical e na horizontal damos o nome de resolução gráfica. assim. representar pontos de visualização. 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.

Logo: 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. ambientes diferentes. Verificaremos agora.Coordenada de Dispositivo Quando uma imagem é visualizada em um dispositivo. Bem. coordenadas diferentes. faz com que a discussão de posicionamento fique independente do dispositivo de Computação Gráfica e Processamento de Imagem 10 . como transformar medidas do mundo real para medidas de dispositivo.2Coordenadas Normalizadas Devido a grande variedade de dispositivos existentes e cada um ter a sua representação de coordenadas.0) corresponde a DC(0. Estas coordenadas variam de 0 a 1. A transformação das coordenadas do mundo em coordenadas normalizadas. Portanto: 0 ≤ dcx ≤ ndhm1 0 ≤ dcy ≤ ndvm1 Onde: dcx dcy -> coordenada x (coluna) do dispositivo -> 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. Cada pixel possui uma coordenada x.0) e NDC(1.6. 1.ndvm1).1.6Sistemas de Coordenadas 1. Tudo isso requer transformações e conversões nas medidas reais daquilo que se quer representar. do zoom de imagem que se pretende aplicar. Toda visualização em qualquer dispositivo deve ser dimensionada e posicionada de acordo com as dimensões do próprio dispositivo. onde x e y são números inteiros (pois não conseguimos endereçar meio pixel). um modelo do mundo real está ali sendo representado.y.Prof Kesede R Julio 1. localização da imagem no visor e claro.6. A visualização em dispositivos gráficos matriciais é realizada através de uma matriz de pixels.1) corresponde a DC(ndhm1. o uso das coordenadas normalizadas de dispositivos (NDC) tornaram-se imprescindíveis.

ndhm1) dcy=round(ndcy. tanto na horizontal quanto na vertical. 1. Portanto: dcx=round(ndcx. 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.4Coordenada do Usuário ou do mundo Tem seus limites e unidade de medida definidos pelo usuário. (pcy/heigth)) Repare que a divisão retorna um valor em percentual a ser multiplicado pela quantidade de pontos endereçáveis. torna-se seu próprio sistema de coordenada. (pcx/width)) dcy = trunc(ndvm1.1Exercícios Computação Gráfica e Processamento de Imagem 11 . Suas medidas podem ser dadas em milímetros ou polegadas. xmin ≤ x ≤ xmax ymin ≤ y ≤ ymax 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.6. ou seja.pxy). A transformação de PC para DC é dada por: dcx = trunc(ndhm1.6. 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. pois a medida em milímetros deve ser convertida em pixel. cada objeto a ser representado. Claro que quando do momento da visualização estas coordenadas devem ser transformadas para dispositivo.Prof Kesede R Julio visualização. dependerão da aplicação. bem próprio da coordenada normalizada.y). Sua representação é dada por PC(pcx. Para fins de exercícios consideraremos uma representação no plano cartesiano. O valor deve ser truncado.ndvm1) 1. O resultado desta divisão é uma proporção. Será representado por UC(x. 1.3Coordenada Física ou do Objeto Neste caso.

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. Defina qual a área específica (Visão Computacional.Prof Kesede R Julio 1.1. Computação Gráfica e Processamento de Imagem 12 .1.Faça uma pesquisa sobre 3 diferentes aplicações de CG.Escreva funções (em qualquer linguagem) de todas as conversões possíveis de coordenadas.3. Processamento de Imagem etc) de cada aplicação. videos etc. exemplificando com imagens.1. Crie um pequeno aplicativo que se utilize destas funções.2. 1. diferentes das apresentadas anteriormente.

figuras curvas e linhas de caracteres.Objetivo Quais pixels devem ser alterados para garantir uma visualização contínua de linhas. e invocam algoritmos de display para construir uma forma geométrica em localizações designadas em um dispositivo de saída.2Primitivas de Saída Gráfica • Procedimentos que tomam a coordenada de entrada. 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.1Desenho de linhas Equação da reta: y = m.Prof Kesede R Julio 2.1. Outros tipos de primitivas de saída são áreas poligonais. • • 2. elipses).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. Ilustração 1Eixos de Simetria Ilustração 2Reflexão sem deformação 2. consideramos as técnicas básicas e algoritmos para mostrar as primitivas em diferentes tipos de sistemas gráficos. circunferências. tais como sistemas vetoriais e raster. Os componentes geométricos mais simples de um quadro são pontos e linhas.2. 2. Para cada tipo de primitiva de saída.x + b Computação Gráfica e Processamento de Imagem 13 . curvas e objetos.

Estudaremos estes critérios a partir de um modelo de reta localizado no primeiro octante (0 o < inclinação < 45o). Problemas: com segmentos no ponto médio da vertical. Por isso.Prof Kesede R Julio onde: m é a inclinação da linha (coeficiente angular) e b a interceptação de y (coeficiente linear). a qual será sempre escolhido a cada intersecção. cria-se linhas densas. x1 y y2 y1 x1 x2 x Afim de escolher qual pixel plotar quando do traçado de uma reta. Problemas: linhas densas Critério 2 :.Seleciona-se o pixel imediatamente abaixo e acima do ponto de intersecção do segmento em cada vertical. y1) e (x2. Critério 3 :. x1 b = y1 – (D y / D x ) . porém a coordenada y exige um estudo de critérios. temos: m = (y2 – y1 )/(x2 – x1) = D y / D x b = y1 – m . 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 vertical. Problemas: descontinuidade Computação Gráfica e Processamento de Imagem 14 . os quais possuem vantagens e desvantagens. y2).Seleciona-se o pixel através do arredondamento do valor da coordenada. exceto quando o ponto de intersecção coincide com um pixel (ponto endereçável).Seleciona-se o pixel mais próximo do ponto de intersecção do segmento com o eixo horizontal. não teremos problemas em escolher a coordenada x. Critério 1 :. podemos levar em consideração vários critérios de escolha. Dados dois pontos (x1.

Evitar gaps no início ou final do segmento 3.Velocidade ótima em qualquer inclinação.Prof Kesede R Julio Características de um bom conversor. Supondo que este segmento se encontra no primeiro octante. Continuidade:. Precisão:. Intensidade independente da inclinação:. Seja um segmento de reta definido por seus extremos P(x1. Espessura uniforme:. Rapidez no traçado dos segmentos:.no caso de segmentos com diferentes inclinações 5.y1 < x2 . o terceiro critério nos parece a melhor solução.Segmento sem interrupção (gaps internos) 6.x1 Computação Gráfica e Processamento de Imagem 15 . y1) e P(x2.aparência de reta 2. y2). De todos os critérios que estudamos. vale as relações: 0 < x1 < x2 0 < y1 < y2 y2 . 1. Linearidade:.Intensidade e espessura constante em todo o segmento 4.

segue abaixo o código em C que implementa a teoria.Prof Kesede R Julio Nestas condições o segmento corta um maior numero de verticais que horizontais Exemplos de resultados pelo critério 3 Neste estudo estamos desconsiderando: • • Linhas grossas e estilos diferentes Cantos de polígonos arredondados Afim de exercitarmos o que vimos. float x2. cin >>y2. Computação Gráfica e Processamento de Imagem 16 .h> #include <iostream.y1. cin >>x2. cin >>y1.1: Este código traça qualquer linha no primeiro octante. cin >>x1.x2. cout <<"\n". float y1. cout <<"Entre com o valor de x1: ". int main(){ float x1. Nas opções de parâmetros de linker (Tools/Compiler Options) deve ser setado (-lalleg) // Tracado de reta no primeiro quadrante #include <allegro. cout <<"Entre com o valor de y2: ".y2). Equação da reta: y=y1+m (x-x1) Onde: m = (y2-y1) / (x2-x1) Exemplo 2.y2.y1. cout <<"Entre com o valor de x2: ".h> void traca(float x1. cout <<"Entre com o valor de y1: ". utilizando biblioteca Allegro e outro exemplo usando a biblioteca OpenGL. Estaremos usando a biblioteca Allegro instalada no Dev-Cpp. float y2).x2. traca(x1.

} readkey().dev) e nas opções de parâmetros de linker do projeto deve ser setado (lopengl32 -lglut32 -lglu). x++){ y= (y1 + m * (x-x1)).0)).h> #include <stdlib.0. } END_OF_MAIN() Exemplo 2. float x. allegro_init(). int x.// especifica o uso de buffer Computação Gráfica e Processamento de Imagem 17 . install_keyboard(). Este codigo deve ser criado dentro de um projeto (. putpixel(screen.640.255. x<=x2.480.Prof Kesede R Julio } void traca( float x1. float x2. cout<<"valor de m: "<<m<<"\n\n". char** argv){ glutInit(&argc.(int)x. for(x=x1.y. int y). e modo de //cores janela glutInitWindowSize (256. 256). 500-(int)y. float y1. Estamos usando aqui a biblioteca Opengl no ambiente do Dev. float y2){ float m. m=(y2-y1) / (x2-x1).2: Este código traça qualquer linha no primeiro octante. set_gfx_mode(GFX_AUTODETECT_WINDOWED. argv).0). void display(void).h> // prototipos das funcoes void init(void). #include <GL/glut. // especifica as dimensoes da // inicializa o glut glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB). A Glut tambem deve estar instalada. void keyboard(unsigned char key. // funcao principal int main(int argc. makecol(255.

glutMainLoop(). return 0.y). } glFlush(). init(). glClear(GL_COLOR_BUFFER_BIT).y1.x++){ y=(y1+m*(x-x1)).y2. 0. int x. glBegin(GL_POINTS). int y){ switch (key) { case 27: exit(0).0). m=(y2-y1)/(x2-x1). glOrtho (0. -1 . // apaga tela // cor de fundo // funcao que sera redesenhada // funcoes de teclado // mostra todas as janelas criadas // define os eixos do modo de projecao // define pontos iniciais e finais para a reta no primeiro octante x1=10.x2.x1. pelo GLUT glutDisplayFunc(display). glEnd(). 256. y1=50. // especifica aonde a janela aparece na // cria a janela tela glutCreateWindow ("Desenhando uma linha"). 0. 0. ortogonal } void display(void){ GLfloat m. break.0. } } // tecla Esc (encerra o programa) // calcula inclinacao // traça reta incrementando x de 1 em 1 e y sendo calculado Computação Gráfica e Processamento de Imagem 18 . glutKeyboardFunc(keyboard). 100). glVertex2f(x. x2=280.1). y2=100. for(x=x1.0.0. 256.x<=x2. // descarrega na tela tudo o que foi traçado } void keyboard(unsigned char key.x. } // definicao de cada funcao void init(void){ glClearColor(0.Prof Kesede R Julio glutInitWindowPosition (100.y. 1.

scanf("%f". Computação Gráfica e Processamento de Imagem 19 .xc )2 + ( y .( x .float r).h> #include <stdio. usando parâmetros de coordenadas Cartesianas ou Polares. yc.h> #include <math.2. Podemos expressar a equação de uma circunferência de várias formas.float yc.3: Traça uma circunferência usando o Allegro.yc )2 = r2 Coordenadas Polares :x = xc + r .1Desenho de Circunferências Os parâmetros básicos que definem uma circunferência são as coordenadas do centro e o raio r. printf("Entre com o valor de xc: ").Prof Kesede R Julio 2. // Traca circunferencia #include <allegro.h> void circ(float xc. Coordenadas Cartesianas :. 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. int main(){ float xc. respectivamente Exemplo 2.&xc). raio.

&yc). x = xc + (r * cos (ang_rad)).0). Computação Gráfica e Processamento de Imagem 20 .0. } Exemplo 2. set_gfx_mode(GFX_AUTODETECT_WINDOWED. // traça circunferencia incrementando o ângulo (ang) de 1 em 1. makecol(0. for(ang=1. install_keyboard().14)/180. printf("Entre com o valor do raio: ").float yc.x.y.raio).0)).xc.yc.2 por esta.800.(int)x.ang.ang_rad. allegro_init(). putpixel(screen.ang_rad. y = yc + (r * sin (ang_rad)).&raio). circ(xc.ang<=360. } readkey().ang++){ ang_rad=(ang*3. 600-(int)y.y.float r){ float ang.yc.600. // o ângulo tambem está sendo convertido para radianos. } END_OF_MAIN() void circ(float xc. scanf("%f". void display(void){ GLfloat m.4: Troque a função display() do exemplo 2. scanf("%f".255.Prof Kesede R Julio printf("Entre com o valor de yc: ").x.r.

determinamos dois raios diferentes. r1 chamado de raio maior e r2 chamado de raio menor. } glFlush(). x = xc + (r * cos (ang_rad)).( x – xc / r1 )2 + ( y – yc / r2 ) 2 = 1 Coordenadas polares :x = xc + r1 . Uma circunferência é uma elipse. Logo. // apaga tela // define ponto central e raio xc=80. o centro está no ponto (xc. temos que: Coordenadas cartesianas:. // o ângulo tambem está sendo convertido para radianos. for(ang=1.ang++){ ang_rad=(ang*3. No caso.3Elipses O Algoritmo de desenho de circunferências pode ser estendido para traçar elipses. glEnd(). y = yc + (r * sin (ang_rad)). glBegin(GL_POINTS).2.ang<=360. yc). r=50. // traça circunferencia incrementando o ângulo (ang) de 1 em 1. yc=80.Prof Kesede R Julio glClear(GL_COLOR_BUFFER_BIT). onde tanto o raio maior como o raio menor são iguais.14)/180. cos Θ y = yc + r2 . sen Θ Computação Gráfica e Processamento de Imagem 21 . // descarrega na tela tudo o que foi traçado } 2. quando vamos determinar a equação da elipse. glVertex2f(x.y).

h> void circ(float xc. printf("Entre com o valor de yc: ").&raio2). Existem vários outras propostas para traçarmos estas primitivas de forma mais otimizada. Computação Gráfica e Processamento de Imagem 22 . scanf("%f". scanf("%f".float yc.0.y. circ(xc.Prof Kesede R Julio Estas implementações de traçado de curvas são experimentais.600. printf("Entre com o valor do raio 2: ").raio1. yc. scanf("%f".h> #include <math. raio2. int main(){ float xc.&yc). printf("Entre com o valor de xc: ").float r2).yc.x. } END_OF_MAIN() void circ(float xc.&raio1).800.raio2). float r2){ float ang.0).&xc). printf("Entre com o valor do raio 1: "). Exemplo 2. allegro_init(). scanf("%f".float yc.h> #include <stdio.float r1. set_gfx_mode(GFX_AUTODETECT_WINDOWED. install_keyboard().ang_rad.5 : Traça elipse usando Allegro // Traca circunferencia #include <allegro.float r1. raio1.

desenvolvido por Bresenham em 1965 tem a vantagem de eliminar o uso do ponto flutuante substituindo-o por inteiro.ang++){ ang_rad=(ang*3.1Ponto Médio para Linhas O nosso problema sempre será decidir qual pixel iremos escolher para continuar o traçado. // o ângulo tambem está sendo convertido para radianos. y = yc + (r2 * sin (ang_rad)). uma vez que para calcular (xi+1.3.Algoritmo de Ponto Médio (Bresenham) O Algoritmo visto anteriormente tem o problema de ser muito lento para ser traçado.ang<=360.14)/180. putpixel(screen. uma vez que se utiliza de ponto flutuante para cálculo de x e y (dependendo da inclinação). for(ang=1. Este método também é chamado de "Incremental".3. x = xc + (r1 * cos (ang_rad)). A seguir veremos cada um deles. Considere.(int)x.Prof Kesede R Julio // traça circunferencia incrementando o ângulo (ang) de 1 em 1. Este Algoritmo foi desenvolvido tanto para o desenho de linhas como para o desenho de circunferências e elipses. Computação Gráfica e Processamento de Imagem 23 . a figura abaixo. makecol(0.0)). no traçado de linhas. } readkey(). 2. O algoritmo de Ponto Médio.255. } 2. yi+1) usamos os valores já calculados de x i e yi. 600-(int)y.

o pixel NE é escolhido. as outras inclinações poderão ser feitas por simetria.Prof Kesede R Julio NE yp+1 yp I M P=(xp. precisamos escolher qual o próximo pixel (E ou NE). Precisamos agora de um método matemático para verificar de que lado (acima ou abaixo) M está em relação a reta.yp) xp E xp+1 Neste estudo. Caso este Ponto Médio esteja acima da reta.yp) foi escolhido. sendo a= dy dx e dy = y 2− y 1 e dx = x 2− x1 Substituindo na equação temos: y= dy x b dx Agora podemos igualar esta equação a zero. Dessa forma. Considerando a equação da reta em termos de sua inclinação: y =ax b . caso esteja abaixo dela. 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). Dado que o pixel P(xp. 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 a ser traçada). o pixel E é escolhido. o erro da escolha neste algoritmo será sempre menor ou igual a ½. assim: Computação Gráfica e Processamento de Imagem 24 .

teremos sempre F(x. Caso a função seja positiva. y =ax by c =0 Através da equação da reta em termos de sua inclinação.y)>0 (positiva). significa que o ponto médio está abaixo do segmento e. substitua qualquer desses pontos na equação implícita. caso seja negativa. caso NE seja escolhido incrementamos 1 em x e também em y. Caso o ponto médio pertença a reta. a = dy b =−dx c =b⋅dx Para pontos sobre a reta. considere a equação implícita da reta: F  x . yp+ ½ ). se E for escolhido.y) < 0 (negativa) e abaixo dela teremos F(x. y =dy⋅x −dx⋅y  B⋅dx =0 Logo. Computação Gráfica e Processamento de Imagem 25 . portanto escolhemos o pixel NE. Esta decisão definirá a escolha do próximo ponto E ou NE. assim: F  x . e portanto escolhemos o pixel E. incrementamos 1 em x. Portanto.y)=0. acima da reta F(x. o cálculo de F(M) = F(x p+1. conseguimos os termos da equação implícita. passaremos a chamá-lo de variável de decisão (d). será 0 (zero) e então podemos escolher E ou NE.Prof Kesede R Julio y= y= y= dy x+ b dx dy⋅x +b dx dy⋅x + b⋅dx dx ( multiplicação da fração por x / 1 ) ( divide pelo denominador e multiplica pelo numerador ) ( transporta o dx para a esquerda ) ( iguala a equação a zero ) dx⋅ y = dy⋅x + b⋅dx dy⋅x − dx⋅ y + b⋅dx = 0 Agora. através da equação da reta. encontre pelo menos mais dois pontos. Como estaremos decidindo através de F(M). o ponto está acima do segmento. Agora. escolha dois pontos quaisquer e. Para efetuar a verificação desta afirmação. Caso E seja escolhido.

Computação Gráfica e Processamento de Imagem 26 . o que não muda em nada no resultado que nos interessa que é o seu sinal. 3 ax p 2a  by p bc 2 − 1 ax p  a by p bc 2 = a b ΔNE= a + b = dy . Portanto: ΔNE=2(dy-dx). 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.Prof Kesede R Julio 1 1 d novo= F  x p 2. Portanto: ΔE=2dy. 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. 3 3 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 ΔNE.dx Aqui também afim de eliminar a fração de b multiplicamos toda a equação por 2. Caso NE seja escolhido.

Sabendo que o ponto inicial (x 1.2 Ponto Médio para Circunferências Assim como para linhas. o objetivo do algoritmo para as circunferências é plotar o próximo ponto. Então.Prof Kesede R Julio Com isso encontramos o incremento caso o ponto E seja escolhido e o incremento caso NE seja escolhido. y = x  y − R 2 2 2 Trataremos do traçado da circunferência apenas para o segundo octante ( 0≤ x≤ R⋅  2  e R≥ y ≤ R   2 ). Bem. pois é ela que será incrementada. 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 . y1) é um ponto da reta. podemos então calcular o dinicial para escolha do primeiro E ou NE. Para isso. e portanto. y p a  = 2 b = a 2 Também afim de eliminar d inicial =2a b =2dy −dx . todos os demais pontos poderão ser traçados por simetria.3. 2. a fração multiplicamos por 2. consideraremos a equação da circunferência: F  x . agora precisamos da variável dinicial . xp P=(xp.yp) xp+1 E M yp yp-1 SE Computação Gráfica e Processamento de Imagem 27 .

y p− = x p 22 y p−  −R 2 2 2 Ao subtrairmos o danterior de dnovo. R−  . Substituindo este ponto da equação. portanto o próximo ponto 1 médio está em 1. R− =1 R − R − R = − R 2 4 4 Para determinarmos os incrementos (ΔE e ΔSE). y p− = x p 22 y p−  −R 2 2 2 Desta forma. dado um ponto P  x p . Caso seja escolhido E. A subtração do primeiro termo já foi calculada no ΔE. afim de tomarmos a melhor decisão.Prof Kesede R Julio Neste caso. encontramos a diferença incremental de ΔE. queremos traçar o próximo ponto E ou SE. Podemos cancelar os dois últimos termos e calcular apenas o primeiro. teremos ΔSE. temos: 2 1 1 5 2 2 2 F  1. temos: 3 3 2 d novo= F  x p 2. Caso seja escolhido E. y p  . y p− = x p 1 2 y p−  − R2 2 2 1 1 2 d novo= F  x p 2. O ponto inicial escolhido é P(0. podemos cancelá-los. procedemos da mesma forma que no algoritmo da linha. fazendo a subtração com o d anterior . assim podemos calcular apenas o segundo termo: Computação Gráfica e Processamento de Imagem 28 . incrementamos 1 em x. Como os terceiros termo são iguais. calculando apenas o primeiro e o segundo termo. assim: d anterior= x p1  − = x p 2x p 11 − = x p2x p 1− 2 2 d novo = x p 2 2− = x 2 p 2x p 2 2 − = x p 4x p 4− 2 2 2 2 ΔE = 2x p 3 Caso SE seja escolhido.R). caso seja SE incrementamos 1 em x e decrementamos 1 em y. Novamente avaliamos o F(M) = d (variável de decisão). então: 1 1 2 d anterior = F  x p1.

Modifique a função que desenha a reta.4.Desenvolva métodos para implementação destas curvas. 2. 2. 2. Computação Gráfica e Processamento de Imagem 29 . C++.3. O boneco deve possuir: cabeça (circulo).4.2. C.1. braços.4. trocando-a pelo algoritmo de Ponto Médio (Bresenham).Faça este boneco piscar os olhos.Prof Kesede R Julio 1 d anterior = x p 12 y p−  −= 2 1 1 2  x p1 2 y 2 − 2 ⋅ y ⋅   − = p 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 2 2  x p 2  y p− 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 2. Exercícios 2.1. olhos (elipse).4. utilizando qualquer linguagem de programação (Java. pascal etc).Desenhe um boneco utilizando apenas as primitivas vistas. pernas e tronco (linhas).4.

a partir de um determinado ponto. Dado um ponto P(x. y). Então podemos. 3 transformações possíveis: translação. transladar apenas o seu ponto inicial e o seu ponto final. podemos transladá-lo em x. no entanto isto torna-se caro computacionalmente. é: P'= T + P Podemos transladar um objeto.1 Translação O movimento de translação é realizado através da soma de um deslocamento em x (tx) e/ou em y (ty). x' = tx + x y' = ty + y Podemos representar estes pontos e deslocamento em matriz. basicamente. Computação Gráfica e Processamento de Imagem 30 . dependendo do destino que se quer dar ao ponto. As transformações aqui apresentadas serão efetuadas em relação à origem. O deslocamento pode ser positivo ou negativo.1Transformações 2D As Transformações 2D são realizadas no plano cartesiano.1. a equação em termos destes vetores. Para deslocarmos o ponto em y a regra é a mesma. Então x' é x transladado de tx e y' é o y transladado de ty. por exemplo. 3. Existem. y'). assim: P = x y P '= x' y' T = tx ty [] [ ] [] Portanto. retraçando a linha no destino. para transladar um linha. 3.2). transladando ponto a ponto da forma vista acima. Isto pode ser feito com polígonos através de seus vértices. assim o novo ponto seria P'(x'.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. rotação e escala. assim como mudá-lo de posição ou menos girá-lo sob um determinado grau. Veja o exemplo de um objeto translado em T(1.

para isso.5. 5) (0. 7) (2.3) (1.2) x (2. um fator de escala em x (sx) e um fator de escala em y (sy).1. ao invés de transladar o objeto. escaloná-lo afim de adequá-lo a uma determinada cena. 5) y (3.Prof Kesede R Julio y (2. x'= sx * x y' = sy * y E portanto.5 no objeto abaixo.25.3) Objeto na Posição inicial 3.2) (4. Estes fatores devem ser multiplicados pelos valores de x e de y do ponto.3 Rotação Objeto Escalonado x Computação Gráfica e Processamento de Imagem 31 .5 e sy=1. teríamos: y (2.2) (4.5.2Escala Podemos também.5. teríamos: P ' = S∗ P  [ ][ x' sx = y' 0 0 x ⋅ sy y ][ ] (1.5. matricialmente.2) x (5.5) y Aplicando um fator sx=0.4) (1.1. Aplicamos. 7. respectivamente.4) Objeto na Posição inicial Objeto Transladado x 3.

Vamos plotar para visualizarmos o objeto. Digite: Computação Gráfica e Processamento de Imagem 32 . teríamos: P ' = R⋅P  x ' = cos  − sen   ⋅ x y' sen   cos   y [ ][ ][ ] y Aplicando uma rotação de 45o positivos no objeto abaixo.5.Prof Kesede R Julio A TG de rotação permite girarmos um objeto de acordo com um determinado ângulo (Θ) especificado.4) e com o cid(4.3. 4. precisamos aplicar fatores de rotação em x e em y. Trabalharemos com um quadrado 2x2.2) x (-1. onde cada coluna representa um ponto (x.y) do objeto (sendo o último igual ao primeiro afim de fechar o quadrado). teremos a seguinte transformação: y (2.2). 1. 5) (-2.1. teríamos: x ' = x⋅cos  Θ  y⋅−sen  Θ  y ' = x⋅sen Θ  y⋅cos  Θ  e matricialmente.9.9 ) Objeto Rotacionado x Objeto na Posição inicial 3. O último ponto deve ser igual ao primeiro para que o objeto seja fechado. Para plotarmos este objeto criaremos uma matriz de pontos P.7 ) (0.2) (4. onde a primeira linha representará o eixo “x” e a segunda linha o eixo “y”.4 ) (1. Matematicamente. Vamos lá: No prompt do Matlab digite: >> P=[2 4 4 2 2. Para isso. com o cse(2. 4.4 4 2 2 4] P= 2 4 4 4 4 2 2 2 2 4 Aqui construímos uma matriz 2x5.2 Laboratório TG 2D em MatLab Primeiramente precisamos construir a matriz de pontos do objeto a ser transformado.

:)).3)=T+P(:. Construa a matriz translação digitando: >> T=[2.2) Pt = 4 5 6 5 >> Pt(:. ylim([0 10]). Agora mostraremos como efetuar as transformações neste objeto. xlim([0 10]). 3. grid on Será mostrado um quadrado em um plano cartesiano x.1 Translação Vamos agora transladar o objeto com os fatores tx=2 e ty=1.Prof Kesede R Julio >> plot(P(1.y com escala de 0 a 10.P(2. gerando cada coluna da matriz resultante Pt (Pontos transladados).2.3) Pt = 4 5 6 5 6 3 Computação Gráfica e Processamento de Imagem 33 .:).1] T= 2 1 Como a transformação de translação é aditiva e não multiplicativa. devemos somar cada coluna da matriz Ponto com a matriz Translação. devido a inconsitência da ordem das matrizes. No prompt do MatLab digite: >> Pt(:.1) Pt = 4 5 >> Pt(:.1)=T+P(:. Assim.2)=T+P(:. não podemos somar toda a matriz Ponto (P) com a matriz Translação (T).

3. Exercícios 1.5 em “x” e 1.4) Pt = 4 5 6 5 6 3 4 3 >> Pt(:. P2(6. xlim([0 10]).5] S= 0.:).2.3) .5000 0 0 1.grid on >> hold off. Plote um triângulo P1(2.0 1. afim de escalonar o objeto com fator 0. uma na posição inicial outra na final (transladada).4)=T+P(:.5)=T+P(:. ylim([0 10]).:)).5000 Computação Gráfica e Processamento de Imagem 34 . Digite: >> S=[0.5 em “y”.3) . Digite: >> hold on. >> plot(Pt(1. podemos plotá-la.Prof Kesede R Julio >> Pt(:.5 0.5) e aplique a translação T(3.2 Escalonamento Construiremos uma matriz escala S. -2). Pronto! Temos agora duas imagens do mesmo objeto.Pt(2.5) Pt = 4 5 6 5 6 3 4 3 4 5 Com a matriz Pt pronta.P3(4.

3 em radianos). >> plot(Ps(1. grid on >> hold on.:).:).Prof Kesede R Julio Com a matriz escala S construída podemos multiplica-la pela matriz de pontos.3 Rotação Agora construiremos a matriz rotação R.2955 0. Digite: >> plot(P(1.3) -sin(0.9553 -0. 3.:)). ylim([0 10]). sin(0.2.9553 Pronto! Com a matriz ponto P e a matriz rotação R construída. Computação Gráfica e Processamento de Imagem 35 . podemos fazer a multiplicação das duas para conseguirmos os novos pontos da matriz rotacionada Pr. Exercícios 1.3) cos(0.3)] R= 0.3) .7).3) .0. >> hold off. afim de obter os novos pontos do objeto.P(2. Plote um triângulo P1 (2. ylim([0 10]). Digite: >> Ps=S*P Ps = 1 6 2 6 2 3 1 3 1 6 Plotamos agora o objeto escalonado. Perceba que o objeto teve uma diminuição em 50% em “x” e teve um aumento de 50% em sua dimensão em “y”. xlim([0 10]). xlim([0 10]).3).:)).2955 0.3. Digite: >> R=[cos(0. assumindo que queremos rotacionar 17o19’ positivos (0.Ps(2.5) e aplique um fator de escalonamento S(0.P3(4. P2(6.

Para gerar suas matrizes basta acrescentar uma coluna e uma linha a cada uma delas.7286 4.5017 0.P(2. P3(4. P2(6. xlim([0 10]).3 Transformações 3D A Transformação 3D acontece no espaço (x.5) e aplique uma transformação R-15. grid on >> hold on.:)). Para limpar a janela do gráfico.:)).:).6393 5.4124 Estes são os novos pontos do objeto rotacionado.7286 4.Prof Kesede R Julio >> Pr=R*P Pr = 0. y. Agora podemos plotá-lo sobre o objeto em sua posição inicial para percebermos a rotação sendo realizada. z) e obedece as mesmas regras das transformações 2D. Assim: Translação: tx T = ty tz [] Computação Gráfica e Processamento de Imagem 36 .3) .2303 3. Crie uma matriz de pontos para um triângulo P1 (2.0928 1.3).:). digite: >> clf Exercícios 1.3196 2. 3. >> hold off.4124 2.0034 3.Pr(2. xlim([0 10]). ylim([0 10]). >> plot(P(1. ylim([0 10]). >> plot(Pr(1.

Prof Kesede R Julio 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): 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 37

Prof Kesede R Julio

Rotação Escala

: P’ = R * P : 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 P ' = S⋅P  y ' = 0 1 0 Rotação: P’ = R * P cos  − sen   0 x x' P ' = R⋅P  y ' = sen   cos   0 ⋅ y 1 0 0 1 1

[ ] [ ][ ]
0 0 x sy 0 ⋅ y 0 1 1

[ ][
[ ][

][ ]

][ ]
38

Computação Gráfica e Processamento de Imagem

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 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

39

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

40

informações de profundidade foram acrescidas às linhas. Podemos ver um exemplo na Figura 4.2.1: Vistas de uma peça Em meados de 70.Prof Kesede R Julio Figura 4. A idéia foi logo generalizada e foram gerados os primeiros modelos tridimensionais chamados de wireframe (fio de arame). desenhado por um conjunto de arestas no espaço. chamado de objeto semitridimensional. Neste caso qualquer parte do objeto poderia ser representada em qualquer ponto de vista e qualquer projeção escolhida pelo usuário. Computação Gráfica e Processamento de Imagem 41 . podendo o computador gerar um objeto unificado.

as arestas se confundiam e ficava difícil a interpretação. 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. 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 42 .2: Modelo Wireframe Como este modelo era composto por um conjunto de arestas. Daí surgiram os modeladores de sólidos. Faltava as informações sobre as superfícies visíveis e não-visíveis para tornar o objeto mais compreensível visualmente. interferência entre componentes etc. massa momento de inércia. Um grande ganho destes modelos é o calculo de volume. interior e exterior do objeto. em princípio. dependendo da complexidade do objeto e do ponto de vista do usuário. Agora os modelos poderiam conter informações sobre faces do objeto (superfícies e arestas) visíveis e escondidas. informações referentes as fronteiras do objeto. ou seja. unindo as vantagens do wireframe e a dos modeladores de superfície. o cálculo de qualquer propriedade geométrica do objeto modelado gerada pela sua capacidade de distinguir superfície.Prof Kesede R Julio Figura 4. além de detalhes sobre suas conectividades.

Computação Gráfica e Processamento de Imagem 43 .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. Instanciamento primitivo. o interior e o exterior do objeto devem ser passíveis de descrição. Finitude: ocupar uma parte finita do espaço Homogeneidade: não pode possuir objetos adendos a ele. Finitude de descrição: um número finito de símbolos deve descrever o objeto. Geometria Sólida Construtiva (CSG-Constructive Solid Geometry).Prof Kesede R Julio Rigidez: transformações rígidas aplicadas sobre ele não podem modificar sua forma.2 4. 4. Figura 4.1 Wireframe Este modelo é também conhecido como fio de arame. onde o traçado de suas linhas pode gerar interpretações ambíguas. Segundo Mortengen existem 6 métodos diferentes de modelagem: Wireframe. O grande problema deste método é a representação de objetos complexos. Decomposição. Fechamento sobre operações: operações geométricas efetuadas sobre objetos válidos devem resultar em um objeto válido. Fronteira (B-Rep ou Polygonal Representation). Determinismo da fronteira: a fronteira. Varredura.

4: Modelagem por Varredura 4. Figura 4. o sólido é representado por uma região bidimensional e um vetor diretor. O sólido é gerado pelo caminho feito pelo vetor diretor.3: Modelo por Instanciamento Primitivo 4.Prof Kesede R Julio Figura 4.3 Varredura Neste modelo.4 Decomposição Computação Gráfica e Processamento de Imagem 44 .

5 GSC – Geometria Sólida Construtiva A representação aqui é realizada por operações e transformações sobre sólidos primitivos. neste modelo. Aplicando transformações geométricas (rotação. Além disso. é representado por um conjunto de sólidos primitivos que são unidos por uma operação de colagem. Esta abordagem é aproximada. cubo e esfera para representar qualquer outro objeto.Prof Kesede R Julio O sólido. intersecção e diferença) sobre as formas primitivas podemos construir quaisquer outras formas de representação. cilindro. Computação Gráfica e Processamento de Imagem 45 .5: Modelagem por Decomposição 4. cone. translação e escala) e operações booleanas (união. Abaixo mostramos um exemplo desta representação em uma estrutura de árvore. devido a grande quantidade de intersecções (ray tracing) a serem calculadas. uma vez que suas curvas são aproximadas. Um grande problema deste método é o custo computacional. Figura 4. ou seja.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). alguns objetos são impossíveis de serem representados apenas com primitivas. Na Figura 4.

Computação Gráfica e Processamento de Imagem 46 .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.Prof Kesede R Julio Figura 4.

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. uma vez que as curvas requerem muitas faces para representá-las.Prof Kesede R Julio Figura 4. porém sua construção é complexa. Computação Gráfica e Processamento de Imagem 47 .7: Modelagem por Fronteira Este é um método de representação muito utilizado nos sistemas gráficos atuais.

0). (4. y).Prof Kesede R Julio 5 Curvas e Superfícies 5 . apenas os pontos são suficientes para mostrar satisfatoriamente os dados. (3.8)}.1 Conjunto de Pontos Uma curva é representada. (1. matematicamente.3). portanto. uma curva é representada por uma sequência de pontos no plano cartesiano (x. Dependendo da aplicação. (2. (-1. Exemplo: {(-2. respectivamente.3).-1). porém se queremos representar uma curva Computação Gráfica e Processamento de Imagem 48 .1 Curvas 5. Resultados de experimentos se utilizam deste forma de representação. Enfim. por um conjunto infinito de pontos.8). Claro que esta representação infinita é impossível de ser descrita analiticamente. Cada um destes pontos representam a distância entre o ponto e a origem dos eixos x e y. (0.0). um conjunto finitos de pontos deve ser escolhido para definir uma curva.1.

A curva paramétrica de Bézier é definida por: P  t =∑ B i J n . precisaremos de mais pontos quanto mais acentuada for a curva.1. i  t = n  t i 1− t n−i i Computação Gráfica e Processamento de Imagem 49 .Prof Kesede R Julio geométrica e não pontos representativos de dados.i (t) são as funções de combinação (blending functions) que influenciam todos os pontos de controle. i  t  i= 0 n 0≤t ≤1 Onde: – – Bi é cada um dos pontos de controle da curva Jn. Pierre Bézier desenvolvendo um projeto para os automóveis da Renault francesa. 3D Max.2 Bézier Em meados de 1960. inclusive para o cálculo da tangente dos pontos iniciais e finais. Os softwares mais populares do mercado (Corel Draw. Exemplo: 5. Auto CAD etc) se utilizam deste conceito para o traçado de curvas. baseou suas curvas em pontos de controle. Estas funções são definidas pelos polinômios de Bernstein: J n .

A esta característica damos o nome de “controle global”.Prof Kesede R Julio Onde: n é o grau dos polinômios e n!  n = i i !  n −i  ! i =0.. i  t ≥0 e n para todo i entre 0 e 1. devemos definir três pontos em uma mesma reta. Neste caso. B2 B1 B4 Curva de Bézier B1 B2 B0 B5 B0 B3 B4 B3 Figura 5. teremos que aumentar o número de pontos para um maior controle. Estas funções devem satisfazer as condições: J n . sendo o ponto do meio da reta coincidentes às duas curvas. para que haja continuidade das curvas. Veja a figura abaixo. pois eles estão relacionados pelo polinômio de Bernstein. Isto pode ser prejudicial quando queremos um ajuste fino na curva. a reta terá seus pontos extremos definidos pelo penúltimo ponto de uma das curvas e o segundo ponto da outra. ou seja. .. Uma solução para isto é a divisão em várias curvas de menor grau. deixamos sua expressão muito complexa. i  t =1. Neste caso. 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. 0 ≤i ≤1 ∑ J n . movemos toda a curva. i=0 .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. isto é.1. Quando aumentamos o número de pontos de uma curva. n  são os coeficientes binomiais. Computação Gráfica e Processamento de Imagem 50 .

B1 e B2. na expressão da curva paramétrica de Bézier.0= J 2. teremos: P  t = B 0 J 2.2= 2! 2 t  1−t 0= t 2 2!0! assim. assim: Computação Gráfica e Processamento de Imagem .1  t  B 2 J 2.0  t  B 1 J 2. teremos: P  t =[ 1−t  2 2 2 2t  1− t  B0 t ] B1 B2 2 [] 51 podemos também separar t em uma matriz de potência. substituindo estes resultados na expressão da curva. como exemplo considerar o traçado de uma curva com três pontos de controle: B0. as funções de combinação (polinômios de Bernstein) seriam: J 2.Prof Kesede R Julio B2 B1 B3 B4 B0 B1 Figura 5.1= 2! 0 t  1−t 2= 1−t 2 =1 −2t t 2 0!2! 2! 1 t  1−t 1= 2t  1−t = 2t− 2t2 1! 1! J 2. Substituindo os polinômios de grau 2. teremos: P  t = 1−t  B0 2t  1−t  B1t B 2 Matricialmente.5: Curvas de menor grau conectadas B2 B3 B0 Podemos.2  t  Portanto.

MB CB Computação Gráfica e Processamento de Imagem 52 . poderíamos ter a seguinte representação: P  t =T Onde: T é o vetor potência MB são os coeficientes da matriz de Bézier CB são os pontos de controle.Prof Kesede R Julio 1 −2 1 B0 1 ] −2 2 0 B1 1 0 0 B2 P  t =[ t 2 t [ ][ ] Resumindo.

Prof Kesede R Julio 6. o que os olhos humanos conseguem ver é uma pequena faixa do espectro de frequência eletromagnética conhecida. Na verdade. parte desta luz é refletida e parte é absorvida pelos objetos expostos.1 Conceitos Básicos As cores nada mais são que frequências eletromagnéticas. brilho e saturação. verde. porém não são quaisquer frequências. Usamos a matiz para dar nome a cor. Caso a parte refletida tenha dominância de alta frequência no escopo visível. passando pelo amarelo. como o sol. por exemplo.Fundamentos de Cor 6. uma vez que a grande maioria delas não são visíveis. Podemos chamar as frequências dominantes refletidas de cor ou de matiz da luz. caso a dominância seja de baixa frequência dizemos que o objeto é de cor violeta. azul e chegando ao violeta. A cada espectro visível está associada uma cor. preta e cinza tem saturação uniforme em todos os comprimentos de onda e por isso. variando entre o vermelho. o brilho é determinado pelo nível de luminância de uma cor em relação a outra cor. As ilustrações abaixo mostram estas variações. As cores branca. dizemos que o objeto tem cor vermelha. são diferenciadas apenas pelo seu Computação Gráfica e Processamento de Imagem 53 . As características da luz são determinadas pela sua matiz. e a saturação é o nível de pureza de um determinada cor. Esta faixa se localiza entre as radiação infravermelha e ultravioleta. Quando temos emissão de uma fonte de luz branca (emissão de todas as frequências do espectro visível).

porém falaremos apenas de dois deles: RGB (Red. onde a posição (0.1. cores que são utilizadas para visualizar outras cores.0.1 RGB Este sistema está baseado na teoria de Young-Helmholtz.1) Blue=(0.1) Níveis de cinza Computação Gráfica e Processamento de Imagem 54 .1.1) a cor branca e a reta diagonal traçada entre estes dois pontos. que diz que a percepção humana para cores acontece através da estimulação de 3 pigmentos presentes nos cones da retina.Prof Kesede R Julio brilho.0.1. A propriedade de cromaticidade é determinada pela saturação e pela matiz da cor. 530 nm (Green) e 450 nm (Blue).0) Red=(1. ou seja.1) branco=(1.0.0. Green. os quais tem seus picos de sensibilidade nos seguintes comprimentos de onda: 630 nm (Red). Este modelo é aditivo.0) Ciano=(0. Os monitores CRT se utilizam deste sistema.1.0) Amarelo=(1.0) representa a cor preta. Existem vários sistemas de cores primárias.0) Magenta=(1. 6.2. estamos falando de cores primárias.2.1 ) preto=(0. Chamamos de espaço de cor a área formada pelas cores intermediárias das cores primárias de cada sistema. Blue) e HSV (Hue.Sistemas de Cores Primárias Quanto falamos de Sistema de Cor. Green=(0. 6.1.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. a posição (1.0. Saturation. Value). os níveis de cinza.

Luminância Luminância=1 (branco) Verde Amarelo Vermelho Ciano Azul Magenta Luminância=0 (preto) Hue (Matiz) Saturação Computação Gráfica e Processamento de Imagem 55 . A representação do sistema é realizada através de um cone de seis lados.2. derivado do cubo unitário RGB.2. a cor é definida pelo seu espectro combinado com a quantidade de cor branca e de cor preta adicionados a ele.Prof Kesede R Julio 6. Saturation. Value) Neste sistema.HSV (Hue.

A origem da imagem se dará neste pixel. que contem a intensidade de cor f(0. Processar a imagem significa manipular os valores que a representam de forma a torná-la adequada aos seus objetivos. enquanto que o eixo Y. seja como for. portanto. uma imagem em branco e preto (binária) pode ser discretizada através de uma matriz 10x10. discretizar o espaço de representação.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 56 . O canto superior esquerdo da matriz será o pixel (0. e a representação da luminosidade em cada pixel por valores 0´s (preto) e 1´s (branco). Veremos cada um deles adiante. uma vez que o reconhecimento intuitivo das informações pelo olho humano é realizado através de imagens. Uma imagem digital. Por exemplo. obrigatoriamente.1 Representação Digital de Imagem Qualquer imagem do mundo real é representada no espaço contínuo.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. (0. Muita manipulação pode ser feita com imagens. está longe de perder a sua importância. porém precisamos antes de tudo entender o que é imagem digital. começará neste ponto e caminhará no sentido vertical para baixo. 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. À 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. ou seja. o eixo X começará neste ponto ponto e caminhará no sentido horizontal para a direita. pode ser representada por uma matriz de dimensões definidas.0). quando digitalizamos esta imagem devemos. 7.

1. >> im=[0:1:255]. foi criado uma matriz 1x256. Crie e mostre uma matriz gradiente. 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. >> im Caso você não coloque o ponto-e-vírgula o retorno é imediato.Crie um vetor com os valores de 0 a 255.Carregue o MatLab. uma vez que apenas dois valores são possíveis para representar a cor do pixel (1 bit de profundidade). . Neste caso. Por exemplo.1 Laboratório 1. poderíamos ter uma imagem gradiente representada na matriz: 0 30 60 90 0 30 60 90 0 30 60 90 0 30 60 90 0 30 60 90 0 30 60 90 0 30 60 90 0 30 60 90 0 30 60 90 0 30 60 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. 7. Para gerar uma transposta de im.Prof Kesede R Julio A esta matriz poderíamos chamar de imagem binária. vamos trabalhar com algumas imagens pequenas. . basta adicionar um apóstrofo após o nome da matriz (im'). com passo de 1. Computação Gráfica e Processamento de Imagem 57 . criadas por nós mesmos.

1).256. O segundo argumento desta função permite assumir uma escala de cinza do menor até o maior elemento do primeiro argumento. Modifique o vetor acima de forma que se torne uma matriz.Prof Kesede R Julio Agora você deve criar uma matriz 256x256.4) a34 = -15 -12 -9 a43 = -15 -12 -9 -6 -3 0 3 6 9 12 15 18 -6 -3 0 3 6 9 12 15 18 >> a43=reshape(a.3) >> a26=reshape(a. repetindo os valores deste vetor nas diversas linhas da matriz >> im=repmat(im. a matriz im é replicada em 256 linha.4. variando de 3 em 3. mas apenas em uma coluna. Trabalhe com ordens diferentes e faça comentários a respeito.6) Computação Gráfica e Processamento de Imagem 58 . logo teremos como resultado uma matriz de 256x256.3. []) A função imshow mostra o primeiro argumento como uma imagem. Mostre a matriz >> imshow(im.2. 2. >> a34=reshape(a. Crie uma lista de -15 a 18. Como a matriz tem 256 colunas. >> a=[-15:3:18] a= -15 -12 -9 -6 -3 0 3 6 9 12 15 18 3. Desta forma. >> im A função repmat() replica o primeiro argumento em cada posição da matriz definida pelos argumentos 2 e 3.

com tamanho mínimo de 50x50.y)).Prof Kesede R Julio a26 = -15 -12 -9 -6 -3 0 3 6 9 12 15 18 4. com tamanho mínimo de 50x50. Quando Computação Gráfica e Processamento de Imagem 59 . como imagem. crie a primeira posição como preta e na segunda imagem como branca. Na primeira imagem. Faça comentários explicativos 2) Crie e mostre duas imagens xadrez (branco e preto).2 Quantização Como foi citado anteriormente temos em cada pixel o valor da luminosidade.1. Profundidade (bits) 1 2 3 4 5 6 7 8 Nr de cores 2 4 8 16 32 64 128 256 Considerando que o espaço onde representamos a imagem é o plano (x. A variação dos valores deste atributo depende da profundidade de cor da imagem. Faça comentários explicativos 7. Caso cada valor apareça como um único pixel. cada uma das matriz geradas. y). teríamos uma profundidade de cor de 1 bit apenas.2 Relatórios 1) Crie e mostre duas imagens listradas (branco e preto). podemos dizer que a intensidade de cor varia no eixo z (f(x. Mostre. crie listras verticais e na segunda horizontais. No caso de uma imagem binária. Na primeira imagem. utilize o parâmetro 'notruesize' na função imshow 7. A tabela abaixo mostra a relação entre o número de cores e a quantidade de bits de profundidade de cor da imagem.

Prof Kesede R Julio quantizamos uma imagem discretizamos sua profundidade de cor. perda de detalhes. 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). e assim por diante. que pode ser representada no espaço de cor de 128 (7 bits). Isto significa que uma imagem no espaço contínuo de cor pode ser representada no espaço discreto de 256 cores (8 bits). será a redução da representação das cores da imagem. A consequência disso. inclusive profundidade de cor. uns mais. pois teremos menos bits para representálas. Mostraremos uma dessas formas.ppm'). outros menos eficientes. >> f=imread('lenina. consequentemente. podemos usar a função imfinfo() com o nome do arquivo da imagem como parâmetro.ppm' FileModDate: '01-Nov-2005 12:22:16' FileSize: 196646 Format: 'PPM' FormatVersion: 'P6' Width: 256 Computação Gráfica e Processamento de Imagem 60 . Na prática.ppm') ans = Filename: 'lenina. >> imfinfo('lenina. dependendo da distribuição das cores na imagem. Podemos fazer a relação do valor do pixel da imagem com o nr de cores que queremos. existem vários métodos de quantização de imagens. >> size(f) ans = 256 256 3 Para saber algumas informações a respeito da imagem. isto seria um processo de proporção.

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.:. >> f8=floor(double(f(:.1))*64/256).[]).1)). >> imshow(f64. 7. apenas é visualizado como nível de cinza.1)) afim de otimizar o algoritmo. >> f2=floor(double(f(:. o valor do mesmo pixel em cada uma das camadas é o mesmo. >> imshow(f2.2. >> imshow(f(:. >> imshow(f8.:. Neste laboratório o arquivo de imagem é RGB.:. Por isso.[]).:. >> f64=floor(double(f(:. Computação Gráfica e Processamento de Imagem 61 .1))*8/256).:. eliminamos as camadas 2 e 3 (f(:.1))*2/256).ppm').[]). Logo. seria: >> f=imread('lenina.1 Laboratório Em matlab.

A indústria gráfica se utiliza deste método para fabricação de jornais e revistas. O método consiste em aglomerar. Exemplo: Computação Gráfica e Processamento de Imagem 62 . este método de quantização não é eficiente para níveis muito baixos de quantização. Quanto mais aglomerado os pixels pretos. 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. maior a ilusão de intensidade mais clara. ordenadamente ou não. O método toma por base que a percepção de detalhes em uma imagem depende. Ou seja. maior a ilusão de intensidade mais escura. Afim de minimizar o problema.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. basicamente. e portanto quanto menor a densidade dos pontos. densidade de resolução da imagem e abertura do olho. foi proposto um método chamado Dithering (ou algoritmo de meio-tom). de 3 coisas: distância da imagem. os pixels de forma a gerar ilusões de meio-tom ao olho humano.

Podemos notar que. Computação Gráfica e Processamento de Imagem 63 .2.Prof Kesede R Julio Vamos criar uma imagem binária da lenina usando dithering. ganhamos muito mais detalhes visuais na imagem.2 Relatórios 7. Faça comentários explicativos.1 Faça os mesmos testes do laboratório anterior. agora com uma foto sua. Verifique em qual transição se dá a perceptividade dos níveis de quantização.2. Compare esta imagem com a quantização de duas cores (imagem binária). >> imshow(fd).2. 7.1)). apesar de termos apenas duas cores. >> fd=dither(f(:. Os testes devem contemplar todos os níveis de quantização de 8 a 1 bit. assim como a aplicação do dithering.:.

3. pois quanto menor a representação.3 Amostragem Além do aumento ou diminuição dos níveis de cinza da imagem. 7.ppm'). passa pela amostragem. Faça a amostragem da imagem original para 64x64 >> f64x64=imresize(f. ou 64x64.Prof Kesede R Julio 7. Computação Gráfica e Processamento de Imagem 64 .[32 32]). a sua resolução. ou seja.[128 128]). quantidade de pontos que representam a imagem. Mostre a imagem >> image(f32x32). isto pode ser conveniente. Faça a amostragem da imagem original para 32x32 >> f32x32=imresize(f.Se temos uma imagem de 256x256 de 8 bits (256 níveis de cinza).[64 64]). menor o espaço ocupado e melhor performance dos algoritmos que serão executados sobre esta imagem. Faça a amostragem da imagem original para 128x128 >> f128x128=imresize(f. começamos a sentir falta de pontos que representem pixels intermediários entre dois pontos. Dependendo da aplicação da visualização da imagem. A função imresize(). Mostre a imagem >> image(f). porém ao diminuirmos a quantidade de pontos para 128x128. como já foi citado. permite-nos verificar este efeito de amostragem.2 Laboratório Leia a imagem original >> f=imread('lenina. Mostre a imagem >> image(f128x128). Mostre a imagem >> image(f64x64). nem percebemos os efeitos da amostragem.

3. 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 65 . agora com uma foto sua. 7.2 Relatórios 7.1 Faça os mesmos testes do laboratório anterior.2. Os testes devem contemplar até 4 níveis do tamanho da imagem.3.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.

através dele podemos verificar como se distribui a intensidade de cada pixel na imagem. Através do histograma da imagem podemos decidir sobre várias operações a serem realizadas e como realizar estas operações. Cada ponto deste gráfico representa a quantidade de pixels de uma determinada intensidade. portanto. 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. temos: Imagem original Histograma da imagem original Imagem equalizada Histograma da imagem equalizada Computação Gráfica e Processamento de Imagem 66 . Um exemplo clássico é a melhora de contraste da imagem através da equalização do seu histograma.Prof Kesede R Julio 7.Histograma Histograma é o gráfico das intensidades de uma imagem. Ou seja. o eixo x deste gráfico indica a variação de intensidade e o eixo y indica a quantidade de pixels.4. Assim.

2 Relatórios Refaça o laboratório. imshow(fhe).1)). ou seja. >> imshow(f). imhist(fhe). melhore o contraste desta imagem através da equalização de seu histograma.Prof Kesede R Julio 7.4. imhist(f(:.Thresholding O thresholding (limiarização) é a forma mais simples de segmentação de uma imagem. faremos apenas alguns testes para entender o seu significado. Computação Gráfica e Processamento de Imagem 67 . no entanto. existem mais intensidades escuras que claras. Note que agora as intensidades dos pixels estão melhores distribuídas no range de 0 a 255 e a imagem está mais clara.:. O que você pode concluir pelo histograma? A equalização melhora ou não a visualização de detalhes? Faça comentários explicativos.4. 7. é um bom thresholding. Os valores de intensidade que estiverem acima do limiar tornam-se brancos e os que estiverem abaixo pretos. Esta variável será um vetor unidimensional.5.:.1 Laboratório Leia e mostre a imagem original. Existem várias técnicas para decidir o seu valor. nem sempre a média. Agora. >> figure. por exemplo. deixando os detalhes da imagem mais nítidos 7. >> f=imread('lenina. Extraia o histograma da imagem e guarde em outra variável. Claro que nem sempre é suficiente. >> figure. O valor de thresholding deve ser decidido de acordo com o nosso interesse. >> fhe=histeq(f(:. >> figure. porém é bastante utilizada quando queremos binarizar uma imagem.ppm'). agora utilizando sua foto. afim de separar uma determinada área de interesse do restante da imagem.1)) Note que os valores de intensidade da imagem não estão distribuídos de maneira uniforme. Mostre este vetor afim de certificar-se disto.

Aplique o thresholding usando a média e mostre a imagem. >>> f30=fg>30. >> mean2(fg) >> f61=fg>61. aplicamos um limiar de 30. que no caso da lenina é 61.ppm'). O melhor caso.5. >>> imshow(f90) Imagem c/ Imagem c/ Imagem c/ trhesholding de 30 trhesholding de 61 trhesholding de 90 (média) Perceba que a imagem torna-se mais escura a medida que aumentamos o thresholding.1 Laboratório Leia e mostre a imagem >>> f=imread('lenina. >>> imshow(f) Podemos converter a imagem de rgb para nível de cinza usando a função rgb2gray(). pelo menos em termos de resgate das Imagem original Computação Gráfica e Processamento de Imagem 68 . >>> imshow(f30) E agora de 90. assim como extrair a média das intensidades através da função mean2(). >> imshow(f61) Agora.Prof Kesede R Julio 7. >> fg=rgb2gray(f). >>> f90=fg>90.

>> imshow(teclas) claro que com alguns ajustes podemos melhorar aquilo que queremos destacar. Com isso.imhist(f). caso queiramos separar objetos de luminosidade diferentes.2 Laboratório Primeiramente lemos a imagem do disco. >> nr=f==255. podemos observar uma concentração de valores em torno dos intervalos 20-50 e 150-180 e também em torno do 255. >> f=rgb2gray(f). Depois disto. guardamos na variável f e visualizamos a imagem. >> teclas=f>20 & f<50. >> figure. Podemos também usar vários valores de thresholding em uma única imagem. >> f=imread('keyb.Prof Kesede R Julio características originais da imagem. >> imshow(nr) Computação Gráfica e Processamento de Imagem 69 . >> fundo=f>150 & f<180. podemos entender que se passarmos thresholding por estes valores. 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. porém as vezes desejamos destacar uma determinada particularidade. >> imshow(fundo) até mesmo intuitivamente podemos perceber que os valores 255 são os números das teclas. é o valor médio. mais escura ou mais clara. 7.pgm'). extraímos o histograma da imagem. partes significativas da imagem poderá ser destacada. >> imshow(f) Convertemos a imagem para nível de cinza.5.

Os valores desta matriz é que definirá a imagem resultante.2.6 Filtros A idéia de filtro (máscara. 5. assim como uma matriz (máscara. pelo menos.5. Estes números definem a quantidade de pixels que serão considerados na operação.Prof Kesede R Julio Imagem original Histograma Im. Faça comentários explicativos sobre cada operação. Orig teclas fundo números 7.5. agora considerando esta imagem. o qual será a referência para a operação de cada pixel da imagem. template etc) é executar uma operação sobre uma imagem afim de modificá-la. Podemos ter vizinhança 8 ou 4. geralmente 3x3) com um pixel central determinado.2 Relatório Escolha uma imagem com. Refaça o procedimento do laboratório (usando o histograma para separar os objetos). dois objetos (grãos de arroz e de milho. 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 70 . por exemplo) separáveis pelo método visto no laboratório 7. Esta operação é realizada utilizando-se a vizinhança de cada pixel da imagem. A vizinhança de um pixel depende da abordagem da operação.

continuamos com a posição (2. eliminar ruídos. eliminado as baixas frequências. Os filtros podem ser classificados em passa-alta. Computação Gráfica e Processamento de Imagem 71 .2) como centro.0+(-1). Este parâmetro gera o contorno através da replicação dos valores de borda da própria imagem.0+1.0+2. detectar bordas ou mesmo realizar efeitos artísticos.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.2=65 Isto ocorrerá em cada posição da imagem. arredondando para cima as casas decimais.23+1. Dessa forma. 5x5. passa-baixa e passa-faixa. O fato é que normalmente usamos uma matriz quadrada de ordem ímpar (3x3. em um filtro de 3x3 teremos a posição (2. Em uma imagem real. Logo.35+(-1). Os filtros passa-alta permitem que altas frequências (mudança brusca em valores de pixels próximos) permaneçam na imagem. a imagem processada será: 0 0 0 0 0 0 0 10 23 1 14 0 0 35 2 50 20 0 0 5 0 0 2 25 24 0 0 0 0 0 0 9 11 32 7 0 A área cinza representa o filtro com seu centro localizado no primeiro 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. 7x7 etc) para usarmos como filtro. em um de 4x4.10+(-1).2) como centro. pois o filtro percorre seu centro sobre cada pixel. e assim por diante.1)=1.0+2. 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. 10 10 23 1 14 14 10 10 23 1 14 14 35 35 2 50 20 20 5 9 9 5 2 25 24 24 7 7 9 11 32 7 9 11 32 7 Através dos filtros podemos suavizar a imagem.0+2. melhorar contraste. Uma vez que o pixel central do filtro deve ser posicionado sobre cada pixel da imagem. a combinação linear a ser processada seria: im(1.

seria: 1 1 1 1 h= .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. Mostramos abaixo alguns destes filtros. Este tipo de filtro tem seu uso bem específico. 1 1 1 9 1 1 1 [ ] Filtro Gaussiano (passa-baixa) Este filtro é uma aproximação digital da função gaussiana. Por exemplo. um horizontal. Um exemplo de um filtro gaussiano seria: 1 4 7 4 1 4 16 26 16 4 1 h= . Cada tipo de filtragem requer mudanças dos valores e tamanho dos filtros. 7 26 41 26 7 273 4 16 26 16 4 1 4 7 4 1 Filtro Sobel (passa-alta) [ ] 72 A aplicação deste filtro permite realçar as bordas da imagem através de 2 filtros. Quanto maior a máscara maior a redução do contraste e a perda da definição da imagem. Os dois filtros. eliminado as que estiverem fora da faixa. em uma máscara 3x3. eliminado as altas frequências. são: −1 −2 −1 hh = 0 0 0 1 2 1 [ ] Computação Gráfica e Processamento de Imagem . pois preserva mais os contornos que o filtro de média. O objetivo disto é destacar altas frequências nos dois sentidos. outro vertical. Os filtros passa-faixa permitem que faixas de frequências permaneçam na imagem. 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. É muito utilizado para reduzir ruídos na imagem.

se a imagem é uint8 e os resultados forem fracionários. >> imf=imfilter(im. permite a construção de vários deles: Filtro 'gaussian' 'sobel' 'prewitt' 'laplacian' 'log' 'average' 'unsharp' Descrição Gaussiano Sobel com enfase horizontal Prewitt com enfase horizontal Laplaciano Laplaciano do filtro Gaussiano Média Unsharp (aumento de contraste) 5. >> h=[-1 0 1] Aplicamos o filtro a imagem.pgm'). 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.Prof Kesede R Julio −1 0 1 hv = −2 0 2 −1 0 1 [ ] Além destes. >> f=imread('cookies. diversos filtros poderiam ser construídos para aplicações diferentes.h) Para que você confira seu entendimento. O Matlab.1 Laboratório Vamos trabalhar primeiro com imagens pequenas para verificarmos melhor os efeitos do filtro nos valores da imagem. Computação Gráfica e Processamento de Imagem 73 . faça os cálculos na mão de pelo menos um dos pixels e valide seus cálculos com o resultado do imfilter. >> imshow(f) Crie um filtro de média. Usaremos esta função para simularmos nossa imagem. os valores decimais serão desconsiderados.6. >> im=magic(4) Criamos agora um filtro h com valor negativo. A função “magic” cria uma matriz quadrada de números aleatorios. através da função fspecial(<filtro>). Leia a imagem do arquivo e mostre-a.

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).h) Mostre as duas imagens em um mesmo figure.1).2). >> subplot(1.2. Neste caso.2 Relatórios 1.title('Imagem filtrada') Im a g e m O r i g i n a l Im a g e m fi l t r a d a Para processar imagens coloridas (rgb) basta usar a mesma metodologia.Prof Kesede R Julio >> h=ones(3)/9 Aplique o filtro sobre a imagem >>fh=imfilter(f. 5.6. filtragem etc.2.. através da teoria dos conjuntos.. segmentação. Aplique o filtro Gaussiano e em seguida o filtro Sobel ou outro que melhor solucione seu problema.7 Morfologia Matemática A morfologia pode ser aplicada para realce de imagens.title('Imagem Original'). A erosão Computação Gráfica e Processamento de Imagem 74 . Escolha uma imagem com ruído e detecte suas bordas. As operações morfológicas consistem na relação das imagens com formas menores e especificamente definidas chamadas elemento estruturante. 5.imshow(fh). Faça laboratório acima (filtro de média) com uma imagem nível de cinza (2D) e uma colorida (3D).. o filtro é passado em cada canal de cor.imshow(f). 2. esqueletização. subplot(1.

B = {(0. pois a operação realizada é de intersecção.2 Erosão A erosão sempre diminui o tamanho da imagem. Abaixo será mostrado alguns exemplos de erosão.1 Dilatação A dilatação sempre aumenta o tamanho da imagem. Veremos apenas operações morfológicas em imagens binárias e tons de cinza.7. 5. porém em cada uma delas o significado será diferente.Prof Kesede R Julio (Intersecção) exclui da imagem formas que não atendam a um determinado padrão (Elemento Estruturante). Computação Gráfica e Processamento de Imagem 75 . (1. tons de cinza ou coloridas. Abaixo será mostrado o processo de dilatação binária. 5. Estas operações podem ser realizadas sobre imagens binárias. pois a operação realizada é de União.7.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.0).

5. ou seja.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. Ele tende a eliminar buracos na imagem. Também pode ser usada para eliminar ruídos na imagem.7.4 Fechamento Um Fechamento Morfológico é uma dilatação seguida imediatamente de uma erosão com mesmo elemento estruturante. fecha espaços vazios. Computação Gráfica e Processamento de Imagem 76 . Veja o exemplo abaixo.3 Abertura Uma Abertura Morfológica é uma erosão seguida imediatamente de uma dilatação com mesmo elemento estruturante. Veja o exemplo abaixo. 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.

7. imshow(textobw2). Comecemos pela dilatação.7.Prof Kesede R Julio 5. title('Dilatado') Computação Gráfica e Processamento de Imagem 77 . O que é Intersecção passa a ser o valor mínimo.5 Morfologia em Tons de Cinza A idéia aqui se modifica um pouco devido aos valores da imagem. Abaixo estão algumas imagens nível de cinza onde foram aplicadas cada operação morfológica vista. passa a ser o valor máximo.png').ee). >> textobw = imread('text. >> ee = strel('line'.90).11. O que é União. Agora crie um EE de linha vertical (90º) de tamanho de 22 pixels. Use o EE criado para dilatar a imagem e mostre a imagem original e a dilatada. >> textobw2 = imdilate(textobw. Leia a imagem text. 5.png. >> imshow(textobw). title('Original') >> figure.6 Laboratório Vamos agora praticar o uso das ferramentas morfológicas.

tif').5). Mostre as duas imagens (original e dilatada). Faça a dilatação da imagem usando o EE criado. >> fotografo2 = imdilate(fotografo. imshow(fotografo2). title('Dilatada') O rig in a l D ila t a d a Perceba que a imagem ficou mais claro. >> imshow(fotografo). Computação Gráfica e Processamento de Imagem 78 . Leia a imagem. pois cada pixel da imagem visitado pelo centro do elemento estruturante. title('Original') >> figure.ee).tif. Crie um EE de uma bola de raio 5.Prof Kesede R Julio O r ig in a l D ila t a d o Faça uma dilatação com a imagem cameraman. >> ee = strel('ball'. >> fotografo = imread('cameraman. assumiu o maior valor de sua vizinhança (considerada pela forma do EE).5.

erodir a image e mostrá-las (original e erodida) para comparação. (Acesse o help do Matlab para verificar as diversas possibilidades de construção do EE através do strel()). A função imview() é uma outra forma de mostrar imagens (experimente as ferramentas da janela). >> circulosBW = imread('circles.11). >> imview(circulosBW) Perceba que os círculos estão sobrepostos. Vamos agora.5. é construído um disco de 11 pixels de raio. imview(circulosBW). Vamos agora construir o Elemento Estruturante através da função strel(). imview(circErodBW) Perceba que agora temos os círculos separados. Você pode construir seu EE através de uma matriz qualquer.png'). ee = strel('disk'. Imagem (binária) original Imagem Erodida Experimente agora erodir uma imagem nível de cinza utilizando o script abaixo: fotografo= imread('cameraman.Prof Kesede R Julio Agora faremos uma erosão em uma imagem binária e depois em uma tom de cinza. % constrói uma bola de raio 5 Computação Gráfica e Processamento de Imagem 79 . ee = strel('ball'. usar o strel(). necessariamente. Você não precisa. circErodBW = imerode(circulosBW. Leia a imagem binária circles.tif'). Neste caso.ee). o que facilita muito uma eventual análise destes objetos.png e mostre-a.5).

5.strel('disk'. >> fundo = imopen(arroz. assumiu o menor valor de sua vizinhança (considerada pela forma do EE). Perceba que a imagem ficou mais escura. >> arroz=imread('rice. criaremos uma imagem sem os grãos de arroz através de uma abertura morfológica.Prof Kesede R Julio fotografo2 = imerode(fotografo. podemos constatar ser uma imagem nível de cinza. title('Erodida') O r ig in a l E ro d id a Este script pode ser colocado dentro de arquivo . Faça isto.8. Primeiramente. imshow(fotografo2). title('Original') figure.ee). >> figure. imshow(fotografo). A idéia é que você possa utilizar as ferramentas aqui descritas para as suas próprias aplicações.png').1 Análise de grãos de arroz Primeiramente vamos ler a imagem do disco e mostrá-la em tela.15)). podemos aplicar uma subtração do fundo afim de equalizá-lo. 5. pois cada pixel da imagem visitado pelo centro do elemento estruturante. Através do seu tamanho (size). imshow(fundo) Computação Gráfica e Processamento de Imagem 80 .8 Estudo de Casos Aqui estaremos listando algumas aplicações práticas de processamento de imagens. >> imshow(arroz) >> size(arroz) Devido ao fundo da imagem ser irregular.m e executado a partir do prompt do matlab.

imshow(arroz2) Podemos então melhorar o contraste desta imagem. usando a função imadjust().4). imshow(arroz3) Apesar de estar bem destacado o que queremos (grãos de arroz).fundo). Estes resultados dependerão de alguns fatores. >> imshow(pseudo_color). Este disco deve ser maior que os grãos. A função im2bw() binariza uma imagem nível de cinza considerando o valor do limiar. >> arroz2 = imsubtract(arroz. 2) componentes que se tocam formando um único componente. A função graythresh() calcula um valor apropriado para fazer a conversão de nível de cinza para binário. >> limiar = graythresh(arroz3). >> arroz3 = imadjust(arroz2). >> [arrozRot. como: 1) tamanho dos componentes. neste caso. 4.Prof Kesede R Julio A função strel(). 'c'. 'shuffle'). >> figure. >> numObjetos numObjetos = 101 Isto mostra que temos 101 grãos de arroz na imagem. @spring. neste caso. cada um dos componentes. Desta forma removemos os grãos de arroz conforme mostra a imagem. de tal forma que não consiga ser colocado totalmente dentro de nenhum deles. ainda temos uma imagem nível de cinza.limiar). 3) tipo de conectividade. A imagem pode ser vista através da visualização de cores sintéticas para cada componente usando label2rgb(). imshow(arrozbw) Na imagem binarizada podemos aplicar a função bwlabel() que contará quantos componentes existem na imagem (numObjects). >> pseudo_color = label2rgb(arrozRot. Agora podemos subtrair o fundo da imagem original. Computação Gráfica e Processamento de Imagem 81 . >> figure.numObjetos] = bwlabel(arrozbw. cria uma imagem em forma de um disco de raio de 15 pixels. ficando assim os grãos de arroz sobre uma superfície totalmente preta. além de rotular numericamente (arrozRot). >> arrozbw = im2bw(arroz3. >> figure. Podemos agora binarizar esta imagem usando thresholding.

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 Imagem com fundo arroz (imopen()) regular (imsubtract()) Melhora de contraste (imadjust()) Imagem binarizada (imbw()) Imagem colorida sinteticamente (label2rgb()) Computação Gráfica e Processamento de Imagem 82 .

Area ans = 176 >> arrozDados(10). o centro de massa e o retângulo que envolve (bounding box) cada um dos componentes.5000 25.5000 86.Centroid ans = 21. através da função regionprops(). podemos também extrair algumas informações destes componentes. seu centroid e o retângulo que o envolve.9716 Dado o valor da área de cada componente (arrozDados.'basic') arrozDados = 101x1 struct array with fields: Area Centroid BoundingBox Assim.Area). >> arrozDados = regionprops(arrozRot.0000 17.0000 >> arrozDados(10). que retornará em uma estrutura. como: Computação Gráfica e Processamento de Imagem 83 .Prof Kesede R Julio Além de contar componentes. para sabermos o valor da área do 10º componente da imagem.3693 95. a área (em pixels). usamos: >>arrozDados(10).BoundingBox ans = 9. algumas questões estatísticos podem ser levantadas.

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. Estas dificuldades acabam por gerar sistema super-especialistas. Esta fase pode exigir alguma inteligência do sistema. No nível baixo temos a captura da imagem (fotografia. 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).Area]) ans = 175. escaneamento. imagem por satélite etc) através de um sensor e um pré-processamento na imagem (contraste. Sabemos que nossa inteligência tem esta capacidade. ruído. aprender por exemplos e generalizar o conhecimento para outros contextos. porém para um computador a tarefa fica mais difícil. texturas etc.0396 5. encontrar picos. ajustes etc) para melhorar a performance do sistema. As técnicas envolvidas permitem a classificação dos objetos determinando sua separabilidade. Aqui Computação Gráfica e Processamento de Imagem 84 . médio e alto. árvore etc). Podemos dividir a tarefa de identificação em processamento de três níveis: baixo. Um sistema de RP deveria ser capaz de extrair informações a partir de um conjunto de informações irrelevantes.Prof Kesede R Julio Qual o tamanho do maior grão? >> max([arrozdados. como por exemplo. No nível médio podemos aplicar processos de separação das áreas de interesse (segmentação).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. inferir informações a partir de informações incompletas. assim como determinar sua representação (vetor.

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. Nível Médio Segmentação Representação Pré-processamento Base de conhecimento Problema Captura da imagem Reconhecimento Resultado Nível Baixo Nível Alto Computação Gráfica e Processamento de Imagem 85 . menos automático será o reconhecimento. A inteligência do sistema nesta fase é fortemente exigida. uma vez que quanto menos aplicada. A figura abaixo mostra uma estrutura básica de RP.