Upcoming SlideShare
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Standard text messaging rates apply

# Computação gráfica

1,194

Published on

processamento de imagens

processamento de imagens

Published in: Design
0 Likes
Statistics
Notes
• Full Name
Comment goes here.

Are you sure you want to Yes No
• Be the first to comment

• Be the first to like this

Views
Total Views
1,194
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
55
0
Likes
0
Embeds 0
No embeds

No notes for slide

### Transcript

• 1. Prof Kesede R Julio Prof Kesede R Julio kesedejulio@gmail.com Apostila de Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem Campinas &#x2013; SP - Brasil Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 1
• 2. Prof Kesede R Julio &#xCD;ndice Cap&#xED;tulo 1.Introdu&#xE7;&#xE3;o..............................................................................................................3 1.1.Breve Hist&#xF3;rico 3 1.2.Contextualiza&#xE7;&#xE3;o 7 1.3Aplica&#xE7;&#xF5;es 7 1.4Dispositivos Gr&#xE1;ficos 8 1.5Resolu&#xE7;&#xE3;o Gr&#xE1;fica 9 1.6Sistemas de Coordenadas 10 1.1Exerc&#xED;cios 11 Cap&#xED;tulo 2.Convers&#xE3;o Matricial de Curvas...........................................................................13 2.1.Objetivo 13 2.2Primitivas de Sa&#xED;da Gr&#xE1;fica 13 2.3.Algoritmo de Ponto M&#xE9;dio (Bresenham)24 2.1. Exerc&#xED;cios 30 Cap&#xED;tulo 3.Transforma&#xE7;&#xF5;es Geom&#xE9;tricas..............................................................................31 3.1Transforma&#xE7;&#xF5;es 2D 31 3.2 Laborat&#xF3;rio TG 2D em MatLab 33 3.1 Transforma&#xE7;&#xF5;es 3D 37 3.4 Coordenadas Homog&#xEA;neas 38 3.5 Composi&#xE7;&#xE3;o de Transforma&#xE7;&#xF5;es 40 Cap&#xED;tulo 4.Modelagem Geom&#xE9;trica......................................................................................42 4.1 Wireframe 45 4.2 Instanciamento Primitivo 45 4.3 Varredura 46 4.4 Decomposi&#xE7;&#xE3;o 46 4.5 GSC &#x2013; Geometria S&#xF3;lida Construtiva 47 4.6 Fronteira 48 Cap&#xED;tulo 5 Curvas e Superf&#xED;cies..........................................................................................50 Cap&#xED;tulo 5 .1 Curvas.............................................................................................................50 Cap&#xED;tulo 6.Fundamentos de Cor............................................................................................55 6.1 Conceitos B&#xE1;sicos 55 6.2.Sistemas de Cores Prim&#xE1;rias 56 Cap&#xED;tulo 7 Processamento de Imagem.................................................................................58 7.1 Representa&#xE7;&#xE3;o Digital de Imagem 58 7.2 Quantiza&#xE7;&#xE3;o 61 7.3 Amostragem 66 7.4.Histograma 68 7.5.Thresholding 69 5.6 Filtros 72 5.7 Morfologia Matem&#xE1;tica 77 5.8 Estudo de Casos 82 5.9 Reconhecimento de Padr&#xF5;es 86 Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 2
• 3. Prof Kesede R Julio 1.Introdu&#xE7;&#xE3;o 1.1.Breve Hist&#xF3;rico A hist&#xF3;ria da Computa&#xE7;&#xE3;o Gr&#xE1;fica (CG) remonta a hist&#xF3;ria dos computadores. Daremos, no entanto, um breve hist&#xF3;rico de como tudo come&#xE7;ou. 1950-1960 :- Primeiros pontos, linhas e figuras visualizadas em tubos de raio cat&#xF3;dicos (CRT). 1960-1970 :- Primeiros jogos utilizando CG: SpaceWar (1961 - estudantes do MIT), Odyssey (primeiro video game comercial). &#xC9; fundada a &#x201C;Evans &amp; Sutherland&#x201D;, primeira empresa de CG da hist&#xF3;ria. Em 1968, o primeiro comercial de televis&#xE3;o utilizando gr&#xE1;ficos vetoriais. Primeiros simuladores de Realidade Virtual (RV). Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 3
• 4. Prof Kesede R Julio Espa&#xE7;o &#x2013; Restart P - Pause A&#xE7;&#xE3;o Nave Gorda Nave Magra Atira Acelera Gira sentido hor&#xE1;rio Gira sentido anti- hor&#xE1;rio V C X Z . , M N SpaceWars- Al&#xE9;m de ter sido o primeiro jogo eletr&#xF4;nico, foi tamb&#xE9;m a primeira simula&#xE7;&#xE3;o de computador a exibir uma representa&#xE7;&#xE3;o gr&#xE1;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&#xE7;amento: 1961 Instituto: MIT G&#xEA;nero: Arcade (?) Gr&#xE1;fico: Duas cores Som: Nenhum Comportamento: Regras 1970-1980 :- Os jogos tornam-se o centro das aten&#xE7;&#xF5;es comerciais. Grande uso da CG em filmes tendo como principal estrela, Star Wars (1977). Pong: Primeiro game a ter uma distribui&#xE7;&#xE3;o de massa, o Pong foi inspirado no oscilosc&#xF3;pio, um instrumento eletr&#xF4;nico que permite observar sinais el&#xE9;tricos num tubo de raios cat&#xF3;dicos, como a TV e as telas de computador. Depois que a General Instruments lan&#xE7;ou o primeiro chip barato, foi poss&#xED;vel construir um sistema completo de Pong com poucos componentes externos. Uma ind&#xFA;stria inteira foi criada e centenas de fabricantes lan&#xE7;aram sua pr&#xF3;pria linha do produto. Ano de lan&#xE7;amento: 1972 Empresa: Atari G&#xEA;nero: Arcade Gr&#xE1;fico: Duas cores Som: 1 bit Comportamento: Regras 1980-1990 :- Surgiram os computadores dom&#xE9;sticos com interface gr&#xE1;fica. Aumento significativo do uso de CG em filmes de Holywood, videoclipes (Dire Straits-1985), curta-metragens de anima&#xE7;&#xE3;o digital. Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 4
• 5. Prof Kesede R Julio IBM PC&#x2122; (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&#xE7;&#xF5;es cinematogr&#xE1;ficas usando CG (Jurrassic Park, Independence Day, Godzilla, Men in Black etc). Primeiro longa-metragem de anima&#xE7;&#xE3;o digital (Cassiop&#xE9;ia (Brasil), Toy Story(EUA)). Cassiop&#xE9;dia &#x2013; 1992 - Primeiro longa-metragem totalmente computadorizado Toy Story &#x2013; 1995 &#x2013; Primeira anima&#xE7;&#xE3;o longa- metragem totalmente computadorizada feita pela Disney. Diferentemente do Cassiop&#xE9;ia, usaram massas como modelos. 2000-atual :- Tend&#xEA;ncia na produ&#xE7;&#xE3;o de &#x201C;atores digitais&#x201D; (Aki Ross em Final Fantasy). Biometria. RV. Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 5
• 6. Prof Kesede R Julio Atores Digitais. Dr. Aki Ross &#xE9; a atriz digital do filme &#x201C;Final Fantasy&#x201D; produzido em 2001. Ela &#xE9; a primeira atriz fotoreal&#xED;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&#xE7;&#xE3;o Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 6 Modelagem Geom&#xE9;trica S&#xED;ntese de Imagens An&#xE1;lise de Imagens Processamento de Imagens DADOS IMAGENS Computa&#xE7;&#xE3;o Gr&#xE1;fica Vis&#xE3;o Computacional
• 8. Prof Kesede R Julio buffer (mem&#xF3;ria de v&#xED;deo), por isso n&#xE3;o h&#xE1; &#x201C;Display List&#x201D;, ficando muito mais f&#xE1;cil a execu&#xE7;&#xE3;o do refresh. Um grande problema deste tipo de dispositivo &#xE9; o desenho de linhas, principalmente quando fora dos eixos sim&#xE9;tricos. Apesar deste problema, estes dispositivos se tornaram populares com o evento dos computadores dom&#xE9;sticos em meados de 1980, devido a grande redu&#xE7;&#xE3;o de custo das mem&#xF3;rias e apesar dos dispositivos Randon Scan terem melhor resolu&#xE7;&#xE3;o que os Raster Scan. A figura abaixo mostra um exemplo de Raster Scan. A qualidade de um dispositivo raster &#xE9; dada por v&#xE1;rios fatores inerentes as suas dimens&#xF5;es f&#xED;sicas e gr&#xE1;ficas. 1.5Resolu&#xE7;&#xE3;o Gr&#xE1;fica Todos os dispositivos gr&#xE1;ficos possuem uma grade (matriz) l&#xF3;gica capaz de endere&#xE7;ar cada uma de suas intersec&#xE7;&#xF5;es e, assim, representar pontos de visualiza&#xE7;&#xE3;o. Ao n&#xFA;mero de pontos endere&#xE7;&#xE1;veis na vertical e na horizontal damos o nome de resolu&#xE7;&#xE3;o gr&#xE1;fica. Existem 4 par&#xE2;metros b&#xE1;sicos para o c&#xE1;lculo desta resolu&#xE7;&#xE3;o: NDH -&gt; n&#xFA;mero de posi&#xE7;&#xF5;es (dots) endere&#xE7;&#xE1;veis horizontalmente NDV -&gt; n&#xFA;mero de posi&#xE7;&#xF5;es endere&#xE7;&#xE1;veis verticalmente WIDTH -&gt; largura f&#xED;sica (em mil&#xED;metros) da &#xE1;rea endere&#xE7;&#xE1;vel HEIGHT -&gt; altura f&#xED;sica (em mil&#xED;metros) da &#xE1;rea endere&#xE7;&#xE1;vel Atrav&#xE9;s destes valores podemos conhecer algumas caracter&#xED;sticas importantes dos dispositivos. Resolu&#xE7;&#xE3;o Horizontal -&gt; ResHoriz = NDH/WIDTH Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 8
• 11. Prof Kesede R Julio Note que no denominador temos a medida exata da janela (horizontal e vertical) e no numerador temos a dist&#xE2;ncia do ponto inicial da janela at&#xE9; o ponto que queremos converter. O resultado desta divis&#xE3;o &#xE9; uma propor&#xE7;&#xE3;o, bem pr&#xF3;prio da coordenada normalizada. 1.1Exerc&#xED;cios 1.1.1.Fa&#xE7;a uma pesquisa sobre 3 diferentes aplica&#xE7;&#xF5;es de CG, diferentes das apresentadas anteriormente. Defina qual a &#xE1;rea espec&#xED;fica (Vis&#xE3;o Computacional, Processamento de Imagem etc) de cada aplica&#xE7;&#xE3;o, exemplificando com imagens, videos etc. 1.1.2.Fa&#xE7;a uma pesquisa das caracter&#xED;sticas de resolu&#xE7;&#xE3;o de 3 modelos diferentes de fabricantes diferentes e mostre um relat&#xF3;rio da sua pesquisa. 1.1.3.Escreva fun&#xE7;&#xF5;es (em qualquer linguagem) de todas as convers&#xF5;es poss&#xED;veis de coordenadas. Crie um pequeno aplicativo que se utilize destas fun&#xE7;&#xF5;es. Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 11
• 12. Prof Kesede R Julio 2.Convers&#xE3;o Matricial de Curvas Um estudo das t&#xE9;cnicas para implementa&#xE7;&#xE3;o de algoritmos de convers&#xE3;o Matricial (Scan Converting Algorithms ) de curvas de um modo geral (linhas, circunfer&#xEA;ncias, elipses). 2.1.Objetivo Quais pixels devem ser alterados para garantir uma visualiza&#xE7;&#xE3;o cont&#xED;nua de linhas, curvas e objetos. 2.2Primitivas de Sa&#xED;da Gr&#xE1;fica &#x2022; Procedimentos que tomam a coordenada de entrada, e invocam algoritmos de display para construir uma forma geom&#xE9;trica em localiza&#xE7;&#xF5;es designadas em um dispositivo de sa&#xED;da. &#x2022; Os componentes geom&#xE9;tricos mais simples de um quadro s&#xE3;o pontos e linhas. Outros tipos de primitivas de sa&#xED;da s&#xE3;o &#xE1;reas poligonais, figuras curvas e linhas de caracteres. Para cada tipo de primitiva de sa&#xED;da, consideramos as t&#xE9;cnicas b&#xE1;sicas e algoritmos para mostrar as primitivas em diferentes tipos de sistemas gr&#xE1;ficos, tais como sistemas vetoriais e raster. &#x2022; A plotagem de pontos &#xE9; implementada num pacote gr&#xE1;fico pela convers&#xE3;o das coordenadas de informa&#xE7;&#xE3;o de um programa de aplica&#xE7;&#xF5;es com instru&#xE7;&#xF5;es para o equipamento de sa&#xED;da em uso. 2.2.1Desenho de linhas Equa&#xE7;&#xE3;o da reta: y = m.x + b Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 12 Ilustra&#xE7;&#xE3;o 2Reflex&#xE3;o sem deforma&#xE7;&#xE3;oIlustra&#xE7;&#xE3;o 1Eixos de Simetria
• 13. Prof Kesede R Julio onde: m &#xE9; a inclina&#xE7;&#xE3;o da linha (coeficiente angular) e b a intercepta&#xE7;&#xE3;o de y (coeficiente linear). Dados dois pontos (x1, y1) e (x2, y2), temos: m = (y2 &#x2013; y1 )/(x2 &#x2013; x1) = D y / D x b = y1 &#x2013; m . x1 b = y1 &#x2013; (D y / D x ) . x1 Afim de escolher qual pixel plotar quando do tra&#xE7;ado de uma reta, podemos levar em considera&#xE7;&#xE3;o v&#xE1;rios crit&#xE9;rios de escolha. Estudaremos estes crit&#xE9;rios a partir de um modelo de reta localizado no primeiro octante (0o &lt; inclina&#xE7;&#xE3;o &lt; 45o ). Por isso, n&#xE3;o teremos problemas em escolher a coordenada x, a qual ser&#xE1; sempre escolhido a cada intersec&#xE7;&#xE3;o, por&#xE9;m a coordenada y exige um estudo de crit&#xE9;rios, os quais possuem vantagens e desvantagens. Crit&#xE9;rio 1 :- Seleciona-se o pixel imediatamente abaixo e acima do ponto de intersec&#xE7;&#xE3;o do segmento em cada vertical, exceto quando o ponto de intersec&#xE7;&#xE3;o coincide com um pixel (ponto endere&#xE7;&#xE1;vel). Problemas: linhas densas Crit&#xE9;rio 2 :- Seleciona-se o pixel atrav&#xE9;s do arredondamento do valor da coordenada. Problemas: com segmentos no ponto m&#xE9;dio da vertical, cria-se linhas densas. Crit&#xE9;rio 3 :- Seleciona-se o pixel mais pr&#xF3;ximo do ponto de intersec&#xE7;&#xE3;o do segmento com o eixo vertical. Vantagens: apar&#xEA;ncia leve e continuidade Crit&#xE9;rio 4 :- Seleciona-se o pixel mais pr&#xF3;ximo do ponto de intersec&#xE7;&#xE3;o do segmento com o eixo horizontal. Problemas: descontinuidade Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 13 x y x1 x2 y1 y2
• 14. Prof Kesede R Julio Caracter&#xED;sticas de um bom conversor. 1. Linearidade:- apar&#xEA;ncia de reta 2. Precis&#xE3;o:- Evitar gaps no in&#xED;cio ou final do segmento 3. Espessura uniforme:- Intensidade e espessura constante em todo o segmento 4. Intensidade independente da inclina&#xE7;&#xE3;o:- no caso de segmentos com diferentes inclina&#xE7;&#xF5;es 5. Continuidade:- Segmento sem interrup&#xE7;&#xE3;o (gaps internos) 6. Rapidez no tra&#xE7;ado dos segmentos:- Velocidade &#xF3;tima em qualquer inclina&#xE7;&#xE3;o. De todos os crit&#xE9;rios que estudamos, o terceiro crit&#xE9;rio nos parece a melhor solu&#xE7;&#xE3;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&#xE7;&#xF5;es: 0 &lt; x1 &lt; x2 0 &lt; y1 &lt; y2 y2 - y1 &lt; x2 - x1 Nestas condi&#xE7;&#xF5;es o segmento corta um maior numero de verticais que horizontais Exemplos de resultados pelo crit&#xE9;rio 3 Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 14
• 15. Prof Kesede R Julio Neste estudo estamos desconsiderando: &#x2022; Linhas grossas e estilos diferentes &#x2022; Cantos de pol&#xED;gonos arredondados Afim de exercitarmos o que vimos, segue abaixo o c&#xF3;digo em C que implementa a teoria, utilizando biblioteca Allegro e outro exemplo usando a biblioteca OpenGL. Equa&#xE7;&#xE3;o da reta: y=y1+m (x-x1) Onde: m = (y2-y1) / (x2-x1) Exemplo 2.1: Este c&#xF3;digo tra&#xE7;a qualquer linha no primeiro octante. Estaremos usando a biblioteca Allegro instalada no Dev-Cpp. Nas op&#xE7;&#xF5;es de par&#xE2;metros de linker (Tools/Compiler Options) deve ser setado (-lalleg) // Tracado de reta no primeiro quadrante #include &lt;allegro.h&gt; #include &lt;iostream.h&gt; void traca(float x1, float x2, float y1, float y2); int main(){ float x1,x2,y1,y2; cout &lt;&lt;"Entre com o valor de x1: "; cin &gt;&gt;x1; cout &lt;&lt;"Entre com o valor de y1: "; cin &gt;&gt;y1; cout &lt;&lt;"Entre com o valor de x2: "; cin &gt;&gt;x2; cout &lt;&lt;"Entre com o valor de y2: "; cin &gt;&gt;y2; cout &lt;&lt;"n"; traca(x1,y1,x2,y2); } void traca( float x1, float y1, float x2, float y2){ Computa&#xE7;&#xE3;o Gr&#xE1;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&lt;&lt;"valor de m: "&lt;&lt;m&lt;&lt;"nn"; for( x=x1; x&lt;=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&#xF3;digo tra&#xE7;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&#xE7;&#xF5;es de par&#xE2;metros de linker do projeto deve ser setado (-lopengl32 -lglut32 -lglu). A Glut tambem deve estar instalada. #include &lt;GL/glut.h&gt; #include &lt;stdlib.h&gt; // 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(&amp;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&#xE7;&#xE3;o Gr&#xE1;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&#xE7;a reta incrementando x de 1 em 1 e y sendo calculado for(x=x1;x&lt;=x2;x++){ y=(y1+m*(x-x1)); glBegin(GL_POINTS); glVertex2f(x,y); glEnd(); } glFlush(); // descarrega na tela tudo o que foi tra&#xE7;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&#xEA;ncias Os par&#xE2;metros b&#xE1;sicos que definem uma circunfer&#xEA;ncia s&#xE3;o as coordenadas do centro e o raio r. Podemos expressar a equa&#xE7;&#xE3;o de uma Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 17
• 18. Prof Kesede R Julio circunfer&#xEA;ncia de v&#xE1;rias formas, usando par&#xE2;metros de coordenadas Cartesianas ou Polares. Coordenadas Cartesianas :- ( x - xc )2 + ( y - yc )2 = r2 Coordenadas Polares :- x = xc + r . cos &#x398; y = yc + r . sen &#x398; Onde: xc &#xE9; a coordenada x do centro da circunfer&#xEA;ncia yc &#xE9; a coordenada y do centro da circunfer&#xEA;ncia r &#xE9; o raio da circunfer&#xEA;ncia &#x398; &#xE9; o &#xE2;ngulo de x e de y, respectivamente Exemplo 2.3: Tra&#xE7;a uma circunfer&#xEA;ncia usando o Allegro. // Traca circunferencia #include &lt;allegro.h&gt; #include &lt;stdio.h&gt; #include &lt;math.h&gt; void circ(float xc,float yc,float r); int main(){ float xc, yc, raio; printf("Entre com o valor de xc: "); scanf("%f",&amp;xc); printf("Entre com o valor de yc: "); scanf("%f",&amp;yc); printf("Entre com o valor do raio: "); scanf("%f",&amp;raio); circ(xc,yc,raio); Computa&#xE7;&#xE3;o Gr&#xE1;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&#xE7;a circunferencia incrementando o &#xE2;ngulo (ang) de 1 em 1. // o &#xE2;ngulo tambem est&#xE1; sendo convertido para radianos. for(ang=1;ang&lt;=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&#xE7;&#xE3;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&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 19
• 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",&amp;xc); printf("Entre com o valor de yc: "); scanf("%f",&amp;yc); printf("Entre com o valor do raio 1: "); scanf("%f",&amp;raio1); printf("Entre com o valor do raio 2: "); scanf("%f",&amp;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&#xE7;a circunferencia incrementando o &#xE2;ngulo (ang) de 1 em 1. // o &#xE2;ngulo tambem est&#xE1; sendo convertido para radianos. for(ang=1;ang&lt;=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&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 21
• 22. Prof Kesede R Julio } readkey(); } 2.3.Algoritmo de Ponto M&#xE9;dio (Bresenham) O Algoritmo visto anteriormente tem o problema de ser muito lento para ser tra&#xE7;ado, uma vez que se utiliza de ponto flutuante para c&#xE1;lculo de x e y (dependendo da inclina&#xE7;&#xE3;o). O algoritmo de Ponto M&#xE9;dio, desenvolvido por Bresenham em 1965 tem a vantagem de eliminar o uso do ponto flutuante substituindo-o por inteiro. Este m&#xE9;todo tamb&#xE9;m &#xE9; chamado de "Incremental", uma vez que para calcular (xi+1, yi+1) usamos os valores j&#xE1; calculados de xi e yi. Este Algoritmo foi desenvolvido tanto para o desenho de linhas como para o desenho de circunfer&#xEA;ncias e elipses. A seguir veremos cada um deles. 2.3.1Ponto M&#xE9;dio para Linhas O nosso problema sempre ser&#xE1; decidir qual pixel iremos escolher para continuar o tra&#xE7;ado. Considere, no tra&#xE7;ado de linhas, a figura abaixo. Neste estudo, estaremos considerando um segmento cuja inclina&#xE7;&#xE3;o est&#xE1; entre 0 e 1 (primeiro octante) e x1 &lt; x2 e y1 &lt; y2 (o segmento come&#xE7;a na esquerda e segue para direita), as outras inclina&#xE7;&#xF5;es poder&#xE3;o ser feitas por simetria. Dado que o pixel P(xp,yp) foi escolhido, precisamos escolher qual o pr&#xF3;ximo pixel (E ou NE). Para proceder esta escolha verificamos onde se localiza o ponto M (Ponto M&#xE9;dio) em rela&#xE7;&#xE3;o a I (ponto de intersec&#xE7;&#xE3;o da pr&#xF3;xima vertical com a reta Computa&#xE7;&#xE3;o Gr&#xE1;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&#xE7;ada). Caso este Ponto M&#xE9;dio esteja acima da reta, o pixel E &#xE9; escolhido, caso esteja abaixo dela, o pixel NE &#xE9; escolhido. Dessa forma, o erro da escolha neste algoritmo ser&#xE1; sempre menor ou igual a &#xBD;. Precisamos agora de um m&#xE9;todo matem&#xE1;tico para verificar de que lado (acima ou abaixo) M est&#xE1; em rela&#xE7;&#xE3;o a reta. Considerando a equa&#xE7;&#xE3;o da reta em termos de sua inclina&#xE7;&#xE3;o: y=ax&#xE083;b , sendo a= dy dx e dy=y2&#x2212;y1 e dx=x2&#x2212;x1 Substituindo na equa&#xE7;&#xE3;o temos: y= dy dx x&#xE083;b Agora podemos igualar esta equa&#xE7;&#xE3;o a zero, assim: y= dy dx x+ b y= dy&#x22C5;x dx + b (multiplica&#xE7;&#xE3;oda fra&#xE7;&#xE3;o por x/1) y= dy&#x22C5;x+ b&#x22C5;dx dx (divide pelo denominador e multiplica pelo numerador) dx&#x22C5;y=dy&#x22C5;x+ b&#x22C5;dx (transportao dx paraa esquerda) dy&#x22C5;x&#x2212;dx&#x22C5;y+ b&#x22C5;dx=0 (iguala aequa&#xE7;&#xE3;o a zero) Agora, considere a equa&#xE7;&#xE3;o impl&#xED;cita da reta: Atrav&#xE9;s da equa&#xE7;&#xE3;o da reta em fun&#xE7;&#xE3;o de sua inclina&#xE7;&#xE3;o, conseguimos os termos da equa&#xE7;&#xE3;o impl&#xED;cita, assim: Logo, Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 23 F&#xE09E;x , y&#xE09F;=ax&#xE083;by&#xE083;c=0 F (x , y)=dy&#x22C5;x&#x2212;dx&#x22C5;y+b&#x22C5;dx=0 a=dy b=&#x2212;dx c=b&#x22C5;dx
• 24. Prof Kesede R Julio Para pontos sobre a reta, teremos sempre F(x,y)=0, acima da reta F(x,y) &lt; 0 (negativa) e abaixo dela teremos F(x,y)&gt;0 (positiva). Para efetuar a verifica&#xE7;&#xE3;o desta afirma&#xE7;&#xE3;o, escolha dois pontos quaisquer e, atrav&#xE9;s da equa&#xE7;&#xE3;o da reta, encontre pelo menos mais dois pontos. Agora, substitua qualquer desses pontos na equa&#xE7;&#xE3;o impl&#xED;cita. Caso o ponto m&#xE9;dio perten&#xE7;a a reta, o c&#xE1;lculo de F(M) = F(xp+1, yp+ &#xBD; ), ser&#xE1; 0 (zero) e ent&#xE3;o podemos escolher E ou NE. Caso a fun&#xE7;&#xE3;o seja positiva, significa que o ponto m&#xE9;dio est&#xE1; abaixo do segmento e, portanto escolhemos o pixel NE; caso seja negativa, o ponto est&#xE1; acima do segmento, e portanto escolhemos o pixel E. Como estaremos decidindo atrav&#xE9;s de F(M), passaremos a cham&#xE1;-lo de vari&#xE1;vel de decis&#xE3;o (d). Esta decis&#xE3;o definir&#xE1; a escolha do pr&#xF3;ximo ponto E ou NE. Portanto, se E for escolhido, incrementamos 1 em x; caso NE seja escolhido incrementamos 1 em x e tamb&#xE9;m em y. Caso E seja escolhido, dnovo=F &#xE09E;xp&#xE083;2, y p&#xE083; 1 2 &#xE09F;=a&#xE09E;xp&#xE083;2&#xE09F;&#xE083;b&#xE09E; yp&#xE083; 1 2 &#xE09F;&#xE083;c e danterior=a&#xE09E;xp&#xE083;1&#xE09F;&#xE083;b&#xE09E; yp&#xE083; 1 2 &#xE09F;&#xE083;c Subtraindo danterior de dnovo obtemos a diferen&#xE7;a incremental &#x394;E. axp&#xE083;2a&#xE083;byp&#xE083; 1 2 b&#xE083;c &#x2212; axp&#xE083; a&#xE083;by p&#xE083; 1 2 b&#xE083;c = a &#x394;E = a = dy Afim de eliminar a fra&#xE7;&#xE3;o de b multiplicamos toda a equa&#xE7;&#xE3;o por 2, o que n&#xE3;o muda em nada no resultado que nos interessa que &#xE9; o seu sinal. Portanto: &#x394;E=2dy. Caso NE seja escolhido, dnovo=F &#xE09E;xp&#xE083;2, y p&#xE083; 3 2 &#xE09F;=a&#xE09E;xp&#xE083;2&#xE09F;&#xE083;b&#xE09E; yp&#xE083; 3 2 &#xE09F;&#xE083;c e Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 24
• 25. Prof Kesede R Julio danterior=a&#xE09E;xp&#xE083;1&#xE09F;&#xE083;b&#xE09E; yp&#xE083; 1 2 &#xE09F;&#xE083;c Subtraindo danterior de dnovo obtemos a diferen&#xE7;a incremental &#x394;NE. axp&#xE083;2a&#xE083;byp&#xE083; 3 2 b&#xE083;c &#x2212; axp&#xE083; a&#xE083;by p&#xE083; 1 2 b&#xE083;c = a&#xE083;b &#x394;NE= a + b = dy - dx Aqui tamb&#xE9;m afim de eliminar a fra&#xE7;&#xE3;o de b multiplicamos toda a equa&#xE7;&#xE3;o por 2. Portanto: &#x394;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&#xE1;vel dinicial , pois &#xE9; ela que ser&#xE1; incrementada. Sabendo que o ponto inicial (x1, y1) &#xE9; um ponto da reta, podemos ent&#xE3;o calcular o dinicial para escolha do primeiro E ou NE. Ent&#xE3;o, F&#xE09E;M &#xE09F;=dinicial=a&#xE09E;xp&#xE083;1&#xE09F;&#xE083;b&#xE09E;y p&#xE083; 1 2 &#xE09F;&#xE083;c= =axp&#xE083;a&#xE083;byp&#xE083; b 2 &#xE083;c= =axp&#xE083;byp&#xE083;c&#xE083;a&#xE083; b 2 = = F&#xE09E;xp , yp&#xE09F;&#xE083;a&#xE083; b 2 = =a&#xE083; b 2 Tamb&#xE9;m afim de eliminar a fra&#xE7;&#xE3;o multiplicamos por 2, e portanto, dinicial =2a&#xE083;b=2dy&#x2212;dx . 2.3.2 Ponto M&#xE9;dio para Circunfer&#xEA;ncias Assim como para linhas, o objetivo do algoritmo para as circunfer&#xEA;ncias &#xE9; plotar o pr&#xF3;ximo ponto. Para isso, consideraremos a equa&#xE7;&#xE3;o da circunfer&#xEA;ncia: F&#xE09E;x , y&#xE09F;=x 2 &#xE083;y 2 &#x2212;R 2 Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 25
• 26. Prof Kesede R Julio Trataremos do tra&#xE7;ado da circunfer&#xEA;ncia apenas para o segundo octante ( 0&#x2264;x&#x2264;R&#x22C5;&#xE08D; &#xE09E;2&#xE09F;e R&#x2265;y&#x2264;R&#xE08D; &#xE09E;2&#xE09F; ), todos os demais pontos poder&#xE3;o ser tra&#xE7;ados por simetria. Neste caso, dado um ponto P&#xE09E;xp , yp&#xE09F; , queremos tra&#xE7;ar o pr&#xF3;ximo ponto E ou SE. Novamente avaliamos o F(M) = d (vari&#xE1;vel de decis&#xE3;o), afim de tomarmos a melhor decis&#xE3;o. O ponto inicial escolhido &#xE9; P(0,R), portanto o pr&#xF3;ximo ponto m&#xE9;dio est&#xE1; em &#xE09E;1, R&#x2212; 1 2 &#xE09F; . Substituindo este ponto da equa&#xE7;&#xE3;o, temos: F&#xE09E;1, R&#x2212; 1 2 &#xE09F;=1&#xE083;&#xE09E;R 2 &#x2212;R&#xE083; 1 4 &#xE09F;&#x2212;R 2 = 5 4 &#x2212;R 2 Para determinarmos os incrementos (&#x394;E e &#x394;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&#xE3;o: danterior=F &#xE09E;xp&#xE083;1, yp&#x2212; 1 2 &#xE09F;=&#xE09E;xp&#xE083;1&#xE09F; 2 &#xE083;&#xE09E; yp&#x2212; 1 2 &#xE09F; 2 &#x2212;R 2 dnovo=F &#xE09E;xp&#xE083;2, y p&#x2212; 1 2 &#xE09F;=&#xE09E;xp&#xE083;2&#xE09F; 2 &#xE083;&#xE09E; yp&#x2212; 1 2 &#xE09F; 2 &#x2212;R 2 Ao subtrairmos o danterior de dnovo, encontramos a diferen&#xE7;a incremental de &#x394;E. Podemos cancelar os dois &#xFA;ltimos termos e calcular apenas o primeiro, assim: Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 26 SE E M P=(xp ,yp ) xp xp +1 yp yp -1
• 27. Prof Kesede R Julio danterior=&#xE09E;xp&#xE083;1&#xE09F; 2 &#xE083;&#xE08B;&#x2212;&#xE08B; = xp 2 &#xE083;2xp 1&#xE083;1 2 &#xE083;&#xE08B;&#x2212;&#xE08B; = xp 2 &#xE083;2xp&#xE083;1&#xE083;&#xE08B;&#x2212;&#xE08B; dnovo =&#xE09E;xp&#xE083;2&#xE09F; 2 &#xE083;&#xE08B;&#x2212;&#xE08B; = xp 2 &#xE083;2xp 2&#xE083;2 2 &#xE083;&#xE08B;&#x2212;&#xE08B; = xp 2 &#xE083;4xp&#xE083;4&#xE083;&#xE08B;&#x2212;&#xE08B; &#x394;E=2xp&#xE083;3 Caso SE seja escolhido, temos: dnovo=F &#xE09E;xp&#xE083;2, y p&#x2212; 3 2 &#xE09F;=&#xE09E;xp&#xE083;2&#xE09F;2 &#xE083;&#xE09E; yp&#x2212; 3 2 &#xE09F; 2 &#x2212;R2 Desta forma, fazendo a subtra&#xE7;&#xE3;o com o danterior , teremos &#x394;SE. Como os terceiros termo s&#xE3;o iguais, podemos cancel&#xE1;-los, calculando apenas o primeiro e o segundo termo. A subtra&#xE7;&#xE3;o do primeiro termo j&#xE1; foi calculada no &#x394;E, assim podemos calcular apenas o segundo termo: danterior=&#xE09E;xp&#xE083;1&#xE09F; 2 &#xE083;&#xE09E; yp&#x2212; 1 2 &#xE09F; 2 &#x2212;&#xE08B;= &#xE09E;xp&#xE083;1&#xE09F; 2 &#xE083;&#xE09E; yp 2 &#x2212;2&#x22C5;y p&#x22C5; 1 2 &#xE083;&#xE09E; 1 2 &#xE09F; 2 &#xE09F;&#x2212;&#xE08B; = &#xE09E;x p&#xE083;1&#xE09F; 2 &#xE083;&#xE09E; yp 2 &#x2212; yp&#xE083; 1 4 &#xE09F;&#x2212;&#xE08B; dnovo = &#xE09E;x p&#xE083;2&#xE09F; 2 &#xE083;&#xE09E;y p&#x2212; 3 2 &#xE09F; 2 &#x2212;&#xE08B; = &#xE09E;xp&#xE083;2&#xE09F; 2 &#xE083;&#xE09E; yp 2 &#x2212;2&#x22C5;yp&#x22C5; 3 2 &#xE083;&#xE09E; 3 2 &#xE09F; 2 &#xE09F;&#x2212;&#xE08B; = &#xE09E;x p&#xE083;2&#xE09F; 2 &#xE083;&#xE09E; yp 2 &#x2212;3yp&#xE083; 9 4 &#xE09F;&#x2212;&#xE08B; &#x394;E=2xp&#xE083;3&#x2212;2y p&#xE083;2=2xp&#x2212;2yp&#xE083;5 2.1. Exerc&#xED;cios 2.4.1.Desenvolva m&#xE9;todos para implementa&#xE7;&#xE3;o destas curvas, utilizando qualquer linguagem de programa&#xE7;&#xE3;o (Java, C++, C, pascal etc). 2.4.2.Desenhe um boneco utilizando apenas as primitivas vistas. O boneco deve possuir: cabe&#xE7;a (circulo), olhos (elipse), bra&#xE7;os, pernas e tronco (linhas). 2.4.3.Fa&#xE7;a este boneco piscar os olhos. 2.4.4.Modifique a fun&#xE7;&#xE3;o que desenha a reta, trocando-a pelo algoritmo de Ponto M&#xE9;dio (Bresenham). Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 27
• 29. Prof Kesede R Julio 3.1.2Escala Podemos tamb&#xE9;m, ao inv&#xE9;s de transladar o objeto, escalon&#xE1;-lo afim de adequ&#xE1;-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&#xED;amos: P'=S&#x2217;P&#xE08C; [x' y' ]= [sx 0 0 sy]&#x22C5; [x y] Aplicando um fator sx=0.5 e sy=1.5 no objeto abaixo, ter&#xED;amos: 3.1.3 Rota&#xE7;&#xE3;o Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 29 (4,2)(1,2) (2.5, 5) x y Objeto na Posi&#xE7;&#xE3;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&#xE7;&#xE3;o inicial (1.25, 7.5) x y Objeto Escalonado (0.5,3) (2,3)
• 30. Prof Kesede R Julio A TG de rota&#xE7;&#xE3;o permite girarmos um objeto de acordo com um determinado &#xE2;ngulo (&#x398;) especificado. Para isso, precisamos aplicar fatores de rota&#xE7;&#xE3;o em x e em y. Matematicamente, ter&#xED;amos: x'=x&#x22C5;cos&#xE09E;&#x398;&#xE09F;&#xE083;y&#x22C5;&#xE09E;&#x2212;sen&#xE09E;&#x398;&#xE09F;&#xE09F; y'=x&#x22C5;sen&#xE09E;&#x398;&#xE09F;&#xE083;y&#x22C5;cos&#xE09E;&#x398;&#xE09F; e matricialmente, ter&#xED;amos: P'=R&#x22C5;P&#xE08C;[x' y' ]=[cos&#xE09E;&#xE0BE;&#xE09F; &#x2212;sen&#xE09E;&#xE0BE;&#xE09F; sen&#xE09E;&#xE0BE;&#xE09F; cos&#xE09E;&#xE0BE;&#xE09F; ]&#x22C5;[x y] Aplicando uma rota&#xE7;&#xE3;o de 45o positivos no objeto abaixo, teremos a seguinte transforma&#xE7;&#xE3;o: 3.2 Laborat&#xF3;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&#xE1; o eixo &#x201C;x&#x201D; e a segunda linha o eixo &#x201C;y&#x201D;. O &#xFA;ltimo ponto deve ser igual ao primeiro para que o objeto seja fechado. Vamos l&#xE1;: No prompt do Matlab digite: &gt;&gt; P=[2 4 4 2 2;4 4 2 2 4] P = 2 4 4 2 2 4 4 2 2 4 Aqui constru&#xED;mos uma matriz 2x5, onde cada coluna representa um ponto (x,y) do objeto (sendo o &#xFA;ltimo igual ao primeiro afim de fechar o quadrado). Vamos plotar para visualizarmos o objeto. Digite: Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 30 (4,2)(1,2) (2.5, 5) x y Objeto na Posi&#xE7;&#xE3;o inicial x y Objeto Rotacionado (-1.1, 1.9 ) (-2.9, 4.7 ) (0.3, 4.4 )
• 31. Prof Kesede R Julio &gt;&gt; plot(P(1,:),P(2,:)), xlim([0 10]), ylim([0 10]), grid on Ser&#xE1; mostrado um quadrado em um plano cartesiano x,y com escala de 0 a 10. Agora mostraremos como efetuar as transforma&#xE7;&#xF5;es neste objeto. 3.2.1 Transla&#xE7;&#xE3;o Vamos agora transladar o objeto com os fatores tx=2 e ty=1. Construa a matriz transla&#xE7;&#xE3;o digitando: &gt;&gt; T=[2;1] T = 2 1 Como a transforma&#xE7;&#xE3;o de transla&#xE7;&#xE3;o &#xE9; aditiva e n&#xE3;o multiplicativa, n&#xE3;o podemos somar toda a matriz Ponto (P) com a matriz Transla&#xE7;&#xE3;o (T), devido a inconsit&#xEA;ncia da ordem das matrizes. Assim, devemos somar cada coluna da matriz Ponto com a matriz Transla&#xE7;&#xE3;o, gerando cada coluna da matriz resultante Pt (Pontos transladados). No prompt do MatLab digite: &gt;&gt; Pt(:,1)=T+P(:,1) Pt = 4 5 &gt;&gt; Pt(:,2)=T+P(:,2) Pt = 4 6 5 5 &gt;&gt; Pt(:,3)=T+P(:,3) Pt = 4 6 6 5 5 3 Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 31
• 32. Prof Kesede R Julio &gt;&gt; Pt(:,4)=T+P(:,4) Pt = 4 6 6 4 5 5 3 3 &gt;&gt; Pt(:,5)=T+P(:,5) Pt = 4 6 6 4 4 5 5 3 3 5 Com a matriz Pt pronta, podemos plot&#xE1;-la. Digite: &gt;&gt; hold on; &gt;&gt; plot(Pt(1,:),Pt(2,:)), xlim([0 10]), ylim([0 10]),grid on &gt;&gt; hold off; Pronto! Temos agora duas imagens do mesmo objeto, uma na posi&#xE7;&#xE3;o inicial outra na final (transladada). Exerc&#xED;cios 1. Plote um tri&#xE2;ngulo P1(2,3) , P2(6,3) ,P3(4,5) e aplique a transla&#xE7;&#xE3;o T(3, -2). 3.2.2 Escalonamento Construiremos uma matriz escala S, afim de escalonar o objeto com fator 0,5 em &#x201C;x&#x201D; e 1,5 em &#x201C;y&#x201D;. Digite: &gt;&gt; S=[0.5 0;0 1.5] S = 0.5000 0 0 1.5000 Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 32
• 33. Prof Kesede R Julio Com a matriz escala S constru&#xED;da podemos multiplica-la pela matriz de pontos, afim de obter os novos pontos do objeto. Digite: &gt;&gt; Ps=S*P Ps = 1 2 2 1 1 6 6 3 3 6 Plotamos agora o objeto escalonado. Digite: &gt;&gt; plot(P(1,:),P(2,:)), xlim([0 10]), ylim([0 10]), grid on &gt;&gt; hold on; &gt;&gt; plot(Ps(1,:),Ps(2,:)), xlim([0 10]), ylim([0 10]); &gt;&gt; hold off; Perceba que o objeto teve uma diminui&#xE7;&#xE3;o em 50% em &#x201C;x&#x201D; e teve um aumento de 50% em sua dimens&#xE3;o em &#x201C;y&#x201D;. Exerc&#xED;cios 1. Plote um tri&#xE2;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&#xE7;&#xE3;o Agora construiremos a matriz rota&#xE7;&#xE3;o R, assumindo que queremos rotacionar 17o19&#x2019; positivos (0,3 em radianos). Digite: &gt;&gt; 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&#xE7;&#xE3;o R constru&#xED;da, podemos fazer a multiplica&#xE7;&#xE3;o das duas para conseguirmos os novos pontos da matriz rotacionada Pr. Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 33
• 34. Prof Kesede R Julio &gt;&gt; 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&#xE3;o os novos pontos do objeto rotacionado. Agora podemos plot&#xE1;-lo sobre o objeto em sua posi&#xE7;&#xE3;o inicial para percebermos a rota&#xE7;&#xE3;o sendo realizada. &gt;&gt; plot(P(1,:),P(2,:)), xlim([0 10]), ylim([0 10]), grid on &gt;&gt; hold on; &gt;&gt; plot(Pr(1,:),Pr(2,:)), xlim([0 10]), ylim([0 10]); &gt;&gt; hold off; Para limpar a janela do gr&#xE1;fico, digite: &gt;&gt; clf Exerc&#xED;cios 1. Crie uma matriz de pontos para um tri&#xE2;ngulo P1(2,3), P2(6,3) , P3(4,5) e aplique uma transforma&#xE7;&#xE3;o R-15. 3.3 Transforma&#xE7;&#xF5;es 3D A Transforma&#xE7;&#xE3;o 3D acontece no espa&#xE7;o (x, y, z) e obedece as mesmas regras das transforma&#xE7;&#xF5;es 2D. Para gerar suas matrizes basta acrescentar uma coluna e uma linha a cada uma delas. Assim: Transla&#xE7;&#xE3;o: T = [ tx ty tz] Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 34
• 35. Prof Kesede R Julio Escala: S= [ sx 0 0 0 sy 0 0 0 sz] Rota&#xE7;&#xE3;o: R= [ cos&#xE09E;&#xE0BE;&#xE09F; &#x2212;sen&#xE09E;&#xE0BE;&#xE09F; 0 sen&#xE09E;&#xE0BE;&#xE09F; cos&#xE09E;&#xE0BE;&#xE09F; 0 0 0 1] Na rota&#xE7;&#xE3;o em 3D, temos a op&#xE7;&#xE3;o de escolhermos qual dos eixos ficar&#xE1; fixo, ou seja, sobre qual eixo queremos que a rota&#xE7;&#xE3;o seja realizada. Por isso, teremos 3 matrizes poss&#xED;veis. Sobre o eixo z (no plano xy): R= [ cos&#xE09E;&#xE0BE;&#xE09F; &#x2212;sen&#xE09E;&#xE0BE;&#xE09F; 0 sen&#xE09E;&#xE0BE;&#xE09F; cos&#xE09E;&#xE0BE;&#xE09F; 0 0 0 1] Sobre o eixo x (no plano yz): R= [ 1 0 0 0 cos&#xE09E;&#xE0BE;&#xE09F; &#x2212;sen&#xE09E;&#xE0BE;&#xE09F; 0 sen&#xE09E;&#xE0BE;&#xE09F; cos&#xE09E;&#xE0BE;&#xE09F; ] Sobre o eixo y (no plano xz): R= [ cos&#xE09E;&#xE0BE;&#xE09F; 0 &#x2212;sen&#xE09E;&#xE0BE;&#xE09F; 0 1 0 sen&#xE09E;&#xE0BE;&#xE09F; 0 cos&#xE09E;&#xE0BE;&#xE09F; ] 3.4 Coordenadas Homog&#xEA;neas As matrizes de Rota&#xE7;&#xE3;o e de Escala s&#xE3;o aplicadas sobre a matriz de Pontos atrav&#xE9;s de uma multiplica&#xE7;&#xE3;o, diferente da matriz Transla&#xE7;&#xE3;o que tem um efeito aditivo sobre a matriz de pontos. Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 35
• 36. Prof Kesede R Julio Rota&#xE7;&#xE3;o : P&#x2019; = R * P Escala : P&#x2019; = S * P Transla&#xE7;&#xE3;o : P&#x2019; = T + P A fim de possibilitar as m&#xFA;ltiplas transforma&#xE7;&#xF5;es no ponto, utilizando composi&#xE7;&#xE3;o de matrizes (rota&#xE7;&#xE3;o, escala e transla&#xE7;&#xE3;o), temos que fazer com que as opera&#xE7;&#xF5;es das matrizes de transforma&#xE7;&#xE3;o com os pontos sejam consistentes (todas devem ser multiplicativas em rela&#xE7;&#xE3;o a matriz ponto). Vamos demonstrar isto com as matrizes no plano (2D), mas por extens&#xE3;o, pode ser aplicado as matrizes no espa&#xE7;o (3D). Para que todas as opera&#xE7;&#xF5;es possam ser multiplicativas, devemos converter as coordenadas de cartesianas (x,y) para homog&#xEA;neas (x,y,W). Na realidade, isso significa que estaremos tratando pontos do plano (2D) atrav&#xE9;s de tr&#xEA;s coordenadas. A coordenada W poder&#xE1; ser dividida por x e y, voltando assim para sua representa&#xE7;&#xE3;o cartesiana. Assim, P(2,3,5) tamb&#xE9;m pode ser representada por P(2/5,3/5,1). Ao usarmos este tipo de representa&#xE7;&#xE3;o temos tamb&#xE9;m que modificar a forma de representa&#xE7;&#xE3;o matricial. Desta forma, todo ponto teria o acr&#xE9;scimo da coordenada homog&#xEA;nea representada pelo plano 1 do espa&#xE7;o 3D. Abaixo apresentamos as novas matrizes de transforma&#xE7;&#xE3;o. Transla&#xE7;&#xE3;o: P&#x2019; = T * P P'=T&#x22C5;P&#xE08C; [ x' y ' 1 ]= [ 1 0 tx 0 1 ty 0 0 1 ]&#x22C5; [ x y 1] Escala: P&#x2019; = S * P P'=S&#x22C5;P&#xE08C; [ x' y' 1 ]= [ sx 0 0 0 sy 0 0 0 1]&#x22C5; [ x y 1] Rota&#xE7;&#xE3;o: P&#x2019; = R * P P'=R&#x22C5;P&#xE08C; [ x' y ' 1 ]= [ cos&#xE09E;&#xE0BE;&#xE09F; &#x2212;sen&#xE09E;&#xE0BE;&#xE09F; 0 sen&#xE09E;&#xE0BE;&#xE09F; cos&#xE09E;&#xE0BE;&#xE09F; 0 0 0 1]&#x22C5; [ x y 1] Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 36
• 37. Prof Kesede R Julio No sentido de aplicarmos v&#xE1;rias transforma&#xE7;&#xF5;es sobre uma matriz de pontos, podemos executar multiplica&#xE7;&#xF5;es consecutivas sobre as matrizes, obedecendo a ordem de multiplica&#xE7;&#xE3;o da direita para a esquerda. P&#x2019; = R * S * T * P 3.5 Composi&#xE7;&#xE3;o de Transforma&#xE7;&#xF5;es As transforma&#xE7;&#xF5;es realizadas sobre um mesmo ponto podem ser combinadas em uma &#xFA;nica matriz, no intuito de aumentar a efici&#xEA;ncia da transforma&#xE7;&#xE3;o. Esta matriz &#xE9; chamada de Matriz Composi&#xE7;&#xE3;o. At&#xE9; agora todas as transforma&#xE7;&#xF5;es foram realizadas a partir da origem, no entanto, podemos desejar uma transforma&#xE7;&#xE3;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&#xE7;&#xF5;es necess&#xE1;rias (R e/ou S e/ou T) na origem. 3. Transladar a matriz de Pontos de volta (Tv ) para sua posi&#xE7;&#xE3;o original. MC = Tv * R * S * To P&#xB4; = MC * P Assim, se quisermos fazer uma rota&#xE7;&#xE3;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&#xFC;&#xEA;ncia de transforma&#xE7;&#xE3;o: MC = T(2,3) * (R-45 * T(-2,-3)) P&#xB4; = MC * P Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 37
• 39. Prof Kesede R Julio Em meados de 70, informa&#xE7;&#xF5;es de profundidade foram acrescidas &#xE0;s linhas, podendo o computador gerar um objeto unificado, chamado de objeto semi- tridimensional, desenhado por um conjunto de arestas no espa&#xE7;o. A id&#xE9;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&#xE7;&#xE3;o escolhida pelo usu&#xE1;rio. Podemos ver um exemplo na Figura 4.2. Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 39 Figura 4.1: Vistas de uma pe&#xE7;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&#xE1;rio, as arestas se confundiam e ficava dif&#xED;cil a interpreta&#xE7;&#xE3;o. Faltava as informa&#xE7;&#xF5;es sobre as superf&#xED;cies vis&#xED;veis e n&#xE3;o-vis&#xED;veis para tornar o objeto mais compreens&#xED;vel visualmente. Da&#xED; surgiram os modeladores de s&#xF3;lidos, unindo as vantagens do wireframe e a dos modeladores de superf&#xED;cie. Agora os modelos poderiam conter informa&#xE7;&#xF5;es sobre faces do objeto (superf&#xED;cies e arestas) vis&#xED;veis e escondidas, ou seja, informa&#xE7;&#xF5;es referentes as fronteiras do objeto, al&#xE9;m de detalhes sobre suas conectividades. Um grande ganho destes modelos &#xE9; o calculo de volume, massa momento de in&#xE9;rcia, interfer&#xEA;ncia entre componentes etc. Uma grande barreira at&#xE9; hoje para a modelagem de s&#xF3;lidos &#xE9; a tecnologia de hardware e de software, que ainda s&#xE3;o fatores limitantes para o bom desempenho dos sistemas. Este modelo permite, em princ&#xED;pio, o c&#xE1;lculo de qualquer propriedade geom&#xE9;trica do objeto modelado gerada pela sua capacidade de distinguir superf&#xED;cie, interior e exterior do objeto. Estes c&#xE1;lculos dependem da valida&#xE7;&#xE3;o do objeto (o s&#xF3;lido deve ser v&#xE1;lido) que devem satisfazer as seguintes propriedades: Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 40 Figura 4.2: Modelo Wireframe
• 41. Prof Kesede R Julio Rigidez: transforma&#xE7;&#xF5;es r&#xED;gidas aplicadas sobre ele n&#xE3;o podem modificar sua forma. Finitude: ocupar uma parte finita do espa&#xE7;o Homogeneidade: n&#xE3;o pode possuir objetos adendos a ele. Determinismo da fronteira: a fronteira, o interior e o exterior do objeto devem ser pass&#xED;veis de descri&#xE7;&#xE3;o. Finitude de descri&#xE7;&#xE3;o: um n&#xFA;mero finito de s&#xED;mbolos deve descrever o objeto. Fechamento sobre opera&#xE7;&#xF5;es: opera&#xE7;&#xF5;es geom&#xE9;tricas efetuadas sobre objetos v&#xE1;lidos devem resultar em um objeto v&#xE1;lido. Segundo Mortengen existem 6 m&#xE9;todos diferentes de modelagem: Wireframe, Instanciamento primitivo, Varredura, Decomposi&#xE7;&#xE3;o, Geometria S&#xF3;lida Construtiva (CSG-Constructive Solid Geometry), Fronteira (B-Rep ou Polygonal Representation). 4.1 Wireframe Este modelo &#xE9; tamb&#xE9;m conhecido como fio de arame. O grande problema deste m&#xE9;todo &#xE9; a representa&#xE7;&#xE3;o de objetos complexos, onde o tra&#xE7;ado de suas linhas pode gerar interpreta&#xE7;&#xF5;es amb&#xED;guas. Figura 4.2 4.2 Instanciamento Primitivo A representa&#xE7;&#xE3;o dos s&#xF3;lidos s&#xE3;o gerados a partir da representa&#xE7;&#xE3;o de s&#xF3;lidos primitivos alterando-se os par&#xE2;metros. Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 41
• 42. Prof Kesede R Julio 4.3 Varredura Neste modelo, o s&#xF3;lido &#xE9; representado por uma regi&#xE3;o bidimensional e um vetor diretor. O s&#xF3;lido &#xE9; gerado pelo caminho feito pelo vetor diretor. 4.4 Decomposi&#xE7;&#xE3;o Computa&#xE7;&#xE3;o Gr&#xE1;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&#xF3;lido, neste modelo, &#xE9; representado por um conjunto de s&#xF3;lidos primitivos que s&#xE3;o unidos por uma opera&#xE7;&#xE3;o de colagem. Na Figura 4.5 podemos ver um modelo por Decomposi&#xE7;&#xE3;o utilizando a t&#xE9;cnica de Enumera&#xE7;&#xE3;o exaustiva (conjunto de s&#xF3;lidos primitivos todos de mesmo tamanho). Esta abordagem &#xE9; aproximada, uma vez que suas curvas s&#xE3;o aproximadas. 4.5 GSC &#x2013; Geometria S&#xF3;lida Construtiva A representa&#xE7;&#xE3;o aqui &#xE9; realizada por opera&#xE7;&#xF5;es e transforma&#xE7;&#xF5;es sobre s&#xF3;lidos primitivos, ou seja, cone, cilindro, cubo e esfera para representar qualquer outro objeto. Aplicando transforma&#xE7;&#xF5;es geom&#xE9;tricas (rota&#xE7;&#xE3;o, transla&#xE7;&#xE3;o e escala) e opera&#xE7;&#xF5;es booleanas (uni&#xE3;o, intersec&#xE7;&#xE3;o e diferen&#xE7;a) sobre as formas primitivas podemos construir quaisquer outras formas de representa&#xE7;&#xE3;o. Um grande problema deste m&#xE9;todo &#xE9; o custo computacional, devido a grande quantidade de intersec&#xE7;&#xF5;es (ray tracing) a serem calculadas. Al&#xE9;m disso, alguns objetos s&#xE3;o imposs&#xED;veis de serem representados apenas com primitivas. Abaixo mostramos um exemplo desta representa&#xE7;&#xE3;o em uma estrutura de &#xE1;rvore. Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 43 Figura 4.5: Modelagem por Decomposi&#xE7;&#xE3;o
• 44. Prof Kesede R Julio 4.6 Fronteira Os objetos aqui s&#xE3;o representados por um conjunto de faces de pol&#xED;gonos planos, onde as fronteiras dos pol&#xED;gonos demarcam as curvas do objeto. Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 44 Figura 4.6: Modelagem por GCS
• 45. Prof Kesede R Julio Este &#xE9; um m&#xE9;todo de representa&#xE7;&#xE3;o muito utilizado nos sistemas gr&#xE1;ficos atuais, por&#xE9;m sua constru&#xE7;&#xE3;o &#xE9; complexa, uma vez que as curvas requerem muitas faces para represent&#xE1;-las. O efeito de suaviza&#xE7;&#xE3;o pode ser feito atrav&#xE9;s de sombreamento e a sua renderiza&#xE7;&#xE3;o realizada atrav&#xE9;s de programas embutidos no hardware. Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 45 Figura 4.7: Modelagem por Fronteira
• 46. Prof Kesede R Julio 5 Curvas e Superf&#xED;cies 5 .1 Curvas 5.1.1 Conjunto de Pontos Uma curva &#xE9; representada, matematicamente, por um conjunto infinito de pontos. Claro que esta representa&#xE7;&#xE3;o infinita &#xE9; imposs&#xED;vel de ser descrita analiticamente, portanto, um conjunto finitos de pontos deve ser escolhido para definir uma curva. Enfim, uma curva &#xE9; representada por uma sequ&#xEA;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&#xE2;ncia entre o ponto e a origem dos eixos x e y, respectivamente. Resultados de experimentos se utilizam deste forma de representa&#xE7;&#xE3;o. Dependendo da aplica&#xE7;&#xE3;o, apenas os pontos s&#xE3;o suficientes para mostrar satisfatoriamente os dados, por&#xE9;m se queremos representar uma curva Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 46
• 47. Prof Kesede R Julio geom&#xE9;trica e n&#xE3;o pontos representativos de dados, precisaremos de mais pontos quanto mais acentuada for a curva. Exemplo: 5.1.2 B&#xE9;zier Em meados de 1960, Pierre B&#xE9;zier desenvolvendo um projeto para os autom&#xF3;veis da Renault francesa, baseou suas curvas em pontos de controle, inclusive para o c&#xE1;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&#xE7;ado de curvas. A curva param&#xE9;trica de B&#xE9;zier &#xE9; definida por: P&#xE09E;t &#xE09F;=&#x2211; i=0 n Bi J n, i&#xE09E;t&#xE09F; 0&#x2264;t&#x2264;1 Onde: &#x2013; Bi &#xE9; cada um dos pontos de controle da curva &#x2013; Jn,i (t) s&#xE3;o as fun&#xE7;&#xF5;es de combina&#xE7;&#xE3;o (blending functions) que influenciam todos os pontos de controle. Estas fun&#xE7;&#xF5;es s&#xE3;o definidas pelos polin&#xF4;mios de Bernstein: J n, i&#xE09E;t&#xE09F;=&#xE09E; n i &#xE09F;t i &#xE09E;1&#x2212;t&#xE09F; n&#x2212;i Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 47
• 48. Prof Kesede R Julio Onde: n &#xE9; o grau dos polin&#xF4;mios e &#xE09E; n i &#xE09F;= n! i !&#xE09E;n&#x2212;i&#xE09F;! &#xE09E;i=0,1,...n&#xE09F; s&#xE3;o os coeficientes binomiais. Estas fun&#xE7;&#xF5;es devem satisfazer as condi&#xE7;&#xF5;es: J n, i&#xE09E;t&#xE09F;&#x2265;0 para todo i entre 0 e 1, isto &#xE9;, 0&#x2264;i&#x2264;1 e &#x2211; i=0 n J n, i&#xE09E;t&#xE09F;=1, , 0&#x2264;t&#x2264;1 esta &#xFA;ltima condi&#xE7;&#xE3;o for&#xE7;a a curva permanecer dentro do pol&#xED;gono convexo (convex hull) definido por todos os pontos de controle. Quando movemos qualquer ponto de controle na curva de B&#xE9;zier, movemos toda a curva, pois eles est&#xE3;o relacionados pelo polin&#xF4;mio de Bernstein. A esta caracter&#xED;stica damos o nome de &#x201C;controle global&#x201D;. Isto pode ser prejudicial quando queremos um ajuste fino na curva. Neste caso, teremos que aumentar o n&#xFA;mero de pontos para um maior controle. Quando aumentamos o n&#xFA;mero de pontos de uma curva, deixamos sua express&#xE3;o muito complexa. Uma solu&#xE7;&#xE3;o para isto &#xE9; a divis&#xE3;o em v&#xE1;rias curvas de menor grau. Neste caso, para que haja continuidade das curvas, devemos definir tr&#xEA;s pontos em uma mesma reta, ou seja, a reta ter&#xE1; seus pontos extremos definidos pelo pen&#xFA;ltimo ponto de uma das curvas e o segundo ponto da outra, sendo o ponto do meio da reta coincidentes &#xE0;s duas curvas. Veja a figura abaixo. Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 48 Figura 5.4: Curva de B&#xE9;zier contida no pol&#xED;gono formado pelos seus pontos de controle B1 B0 B2 B3 B4 Curva de B&#xE9;zier B1 B0 B2 B3 B4 B5
• 49. Prof Kesede R Julio Podemos, como exemplo considerar o tra&#xE7;ado de uma curva com tr&#xEA;s pontos de controle: B0, B1 e B2. Substituindo os polin&#xF4;mios de grau 2, na express&#xE3;o da curva param&#xE9;trica de B&#xE9;zier, teremos: P&#xE09E;t &#xE09F;=B0 J 2,0&#xE09E;t &#xE09F;&#xE083;B1 J 2,1&#xE09E;t &#xE09F;&#xE083;B2 J 2,2&#xE09E;t&#xE09F; Portanto, as fun&#xE7;&#xF5;es de combina&#xE7;&#xE3;o (polin&#xF4;mios de Bernstein) seriam: J 2,0= 2! 0!2! t 0 &#xE09E;1&#x2212;t &#xE09F; 2 =&#xE09E;1&#x2212;t &#xE09F; 2 =1&#x2212;2t&#xE083;t 2 J 2,1= 2! 1! 1! t1 &#xE09E;1&#x2212;t &#xE09F;1 =2t&#xE09E;1&#x2212;t &#xE09F;=2t&#x2212;2t2 J 2,2= 2! 2!0! t 2 &#xE09E;1&#x2212;t &#xE09F; 0 =t 2 assim, substituindo estes resultados na express&#xE3;o da curva, teremos: P&#xE09E;t &#xE09F;=&#xE09E;1&#x2212;t&#xE09F; 2 B0&#xE083;2t&#xE09E;1&#x2212;t&#xE09F; B1&#xE083;t 2 B2 Matricialmente, teremos: P&#xE09E;t &#xE09F;=[&#xE09E;1&#x2212;t 2 &#xE09F; 2t&#xE09E;1&#x2212;t&#xE09F; t 2 ] [ B0 B1 B2 ] podemos tamb&#xE9;m separar t em uma matriz de pot&#xEA;ncia, assim: Computa&#xE7;&#xE3;o Gr&#xE1;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 P&#xE09E;t &#xE09F;=[t2 t 1] [ 1 &#x2212;2 1 &#x2212;2 2 0 1 0 0][ B0 B1 B2 ] Resumindo, poder&#xED;amos ter a seguinte representa&#xE7;&#xE3;o: P&#xE09E;t &#xE09F;=T MB CB Onde: T &#xE9; o vetor pot&#xEA;ncia MB s&#xE3;o os coeficientes da matriz de B&#xE9;zier CB s&#xE3;o os pontos de controle. Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 50
• 51. Prof Kesede R Julio 6.Fundamentos de Cor 6.1 Conceitos B&#xE1;sicos As cores nada mais s&#xE3;o que frequ&#xEA;ncias eletromagn&#xE9;ticas, por&#xE9;m n&#xE3;o s&#xE3;o quaisquer frequ&#xEA;ncias, uma vez que a grande maioria delas n&#xE3;o s&#xE3;o vis&#xED;veis. Na verdade, o que os olhos humanos conseguem ver &#xE9; uma pequena faixa do espectro de frequ&#xEA;ncia eletromagn&#xE9;tica conhecida. Esta faixa se localiza entre as radia&#xE7;&#xE3;o infravermelha e ultravioleta. A cada espectro vis&#xED;vel est&#xE1; associada uma cor, variando entre o vermelho, passando pelo amarelo, verde, azul e chegando ao violeta. As ilustra&#xE7;&#xF5;es abaixo mostram estas varia&#xE7;&#xF5;es. Quando temos emiss&#xE3;o de uma fonte de luz branca (emiss&#xE3;o de todas as frequ&#xEA;ncias do espectro vis&#xED;vel), como o sol, por exemplo, parte desta luz &#xE9; refletida e parte &#xE9; absorvida pelos objetos expostos. Caso a parte refletida tenha domin&#xE2;ncia de alta frequ&#xEA;ncia no escopo vis&#xED;vel, dizemos que o objeto tem cor vermelha; caso a domin&#xE2;ncia seja de baixa frequ&#xEA;ncia dizemos que o objeto &#xE9; de cor violeta. Podemos chamar as frequ&#xEA;ncias dominantes refletidas de cor ou de matiz da luz. As caracter&#xED;sticas da luz s&#xE3;o determinadas pela sua matiz, brilho e satura&#xE7;&#xE3;o. Usamos a matiz para dar nome a cor, o brilho &#xE9; determinado pelo n&#xED;vel de lumin&#xE2;ncia de uma cor em rela&#xE7;&#xE3;o a outra cor, e a satura&#xE7;&#xE3;o &#xE9; o n&#xED;vel de pureza de um determinada cor. As cores branca, preta e cinza tem satura&#xE7;&#xE3;o uniforme em todos os comprimentos de onda e por isso, s&#xE3;o diferenciadas apenas pelo seu Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 51
• 53. Prof Kesede R Julio 6.2.2.HSV (Hue, Saturation, Value) Neste sistema, a cor &#xE9; definida pelo seu espectro combinado com a quantidade de cor branca e de cor preta adicionados a ele. A representa&#xE7;&#xE3;o do sistema &#xE9; realizada atrav&#xE9;s de um cone de seis lados, derivado do cubo unit&#xE1;rio RGB. Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 53 Vermelho AmareloVerde Ciano Azul Magenta Lumin&#xE2;ncia Satura&#xE7;&#xE3;o Hue (Matiz) Lumin&#xE2;ncia=0 (preto) Lumin&#xE2;ncia=1 (branco)
• 56. Prof Kesede R Julio Agora voc&#xEA; deve criar uma matriz 256x256, repetindo os valores deste vetor nas diversas linhas da matriz &gt;&gt; im=repmat(im,256,1); &gt;&gt; im A fun&#xE7;&#xE3;o repmat() replica o primeiro argumento em cada posi&#xE7;&#xE3;o da matriz definida pelos argumentos 2 e 3. Desta forma, a matriz im &#xE9; 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 &gt;&gt; imshow(im, []) A fun&#xE7;&#xE3;o imshow mostra o primeiro argumento como uma imagem. O segundo argumento desta fun&#xE7;&#xE3;o permite assumir uma escala de cinza do menor at&#xE9; o maior elemento do primeiro argumento. 2. Crie uma lista de -15 a 18, variando de 3 em 3. &gt;&gt; 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&#xE7;a coment&#xE1;rios a respeito. &gt;&gt; a34=reshape(a,3,4) a34 = -15 -6 3 12 -12 -3 6 15 -9 0 9 18 &gt;&gt; a43=reshape(a,4,3) a43 = -15 -3 9 -12 0 12 -9 3 15 -6 6 18 &gt;&gt; a26=reshape(a,2,6) Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 56
• 58. Prof Kesede R Julio quantizamos uma imagem discretizamos sua profundidade de cor. Isto significa que uma imagem no espa&#xE7;o cont&#xED;nuo de cor pode ser representada no espa&#xE7;o discreto de 256 cores (8 bits), que pode ser representada no espa&#xE7;o de cor de 128 (7 bits), e assim por diante. A consequ&#xEA;ncia disso, ser&#xE1; a redu&#xE7;&#xE3;o da representa&#xE7;&#xE3;o das cores da imagem, pois teremos menos bits para represent&#xE1;- las, consequentemente, perda de detalhes. Na pr&#xE1;tica, existem v&#xE1;rios m&#xE9;todos de quantiza&#xE7;&#xE3;o de imagens, uns mais, outros menos eficientes, dependendo da distribui&#xE7;&#xE3;o das cores na imagem. Mostraremos uma dessas formas. Podemos fazer a rela&#xE7;&#xE3;o do valor do pixel da imagem com o nr de cores que queremos, isto seria um processo de propor&#xE7;&#xE3;o. Assim: valordo pixelatual nr decores atual = valor do pixel quantizado nr decores desejada Atrav&#xE9;s da fun&#xE7;&#xE3;o size() podemos identificar se estamos tratando com uma imagem RGB (3 camadas) ou n&#xED;vel de cinza (1 camada). &gt;&gt; f=imread('lenina.ppm'); &gt;&gt; size(f) ans = 256 256 3 Para saber algumas informa&#xE7;&#xF5;es a respeito da imagem, inclusive profundidade de cor, podemos usar a fun&#xE7;&#xE3;o imfinfo() com o nome do arquivo da imagem como par&#xE2;metro. &gt;&gt; imfinfo('lenina.ppm') ans = Filename: 'lenina.ppm' FileModDate: '01-Nov-2005 12:22:16' FileSize: 196646 Format: 'PPM' FormatVersion: 'P6' Width: 256 Computa&#xE7;&#xE3;o Gr&#xE1;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&#xF3;rio o arquivo de imagem &#xE9; RGB, apenas &#xE9; visualizado como n&#xED;vel de cinza. Logo, o valor do mesmo pixel em cada uma das camadas &#xE9; o mesmo. Por isso, eliminamos as camadas 2 e 3 (f(:,:,1)) afim de otimizar o algoritmo. 7.2.1 Laborat&#xF3;rio Em matlab, seria: &gt;&gt; f=imread('lenina.ppm'); &gt;&gt; imshow(f(:,:,1)); &gt;&gt; f64=floor(double(f(:,:,1))*64/256); &gt;&gt; imshow(f64,[]); &gt;&gt; f8=floor(double(f(:,:,1))*8/256); &gt;&gt; imshow(f8,[]); &gt;&gt; f2=floor(double(f(:,:,1))*2/256); &gt;&gt; imshow(f2,[]); Computa&#xE7;&#xE3;o Gr&#xE1;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&#xE3;o percebemos os n&#xED;veis de quantiza&#xE7;&#xE3;o, na imagem de 3 bits os n&#xED;veis s&#xE3;o percebidos e na imagem de 1 bit a percep&#xE7;&#xE3;o das bordas de quantiza&#xE7;&#xE3;o &#xE9; t&#xE3;o grande que perdemos a visualiza&#xE7;&#xE3;o da imagem. Ou seja, este m&#xE9;todo de quantiza&#xE7;&#xE3;o n&#xE3;o &#xE9; eficiente para n&#xED;veis muito baixos de quantiza&#xE7;&#xE3;o. Afim de minimizar o problema, foi proposto um m&#xE9;todo chamado Dithering (ou algoritmo de meio-tom). O m&#xE9;todo toma por base que a percep&#xE7;&#xE3;o de detalhes em uma imagem depende, basicamente, de 3 coisas: dist&#xE2;ncia da imagem, densidade de resolu&#xE7;&#xE3;o da imagem e abertura do olho. A ind&#xFA;stria gr&#xE1;fica se utiliza deste m&#xE9;todo para fabrica&#xE7;&#xE3;o de jornais e revistas. O m&#xE9;todo consiste em aglomerar, ordenadamente ou n&#xE3;o, os pixels de forma a gerar ilus&#xF5;es de meio-tom ao olho humano. Quanto mais aglomerado os pixels pretos, maior a ilus&#xE3;o de intensidade mais escura, e portanto quanto menor a densidade dos pontos, maior a ilus&#xE3;o de intensidade mais clara. Exemplo: Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 60
• 61. Prof Kesede R Julio Vamos criar uma imagem bin&#xE1;ria da lenina usando dithering. &gt;&gt; fd=dither(f(:,:,1)); &gt;&gt; imshow(fd); Podemos notar que, apesar de termos apenas duas cores, ganhamos muito mais detalhes visuais na imagem. Compare esta imagem com a quantiza&#xE7;&#xE3;o de duas cores (imagem bin&#xE1;ria). 7.2.2 Relat&#xF3;rios 7.2.2.1 Fa&#xE7;a os mesmos testes do laborat&#xF3;rio anterior, agora com uma foto sua. Os testes devem contemplar todos os n&#xED;veis de quantiza&#xE7;&#xE3;o de 8 a 1 bit, assim como a aplica&#xE7;&#xE3;o do dithering. Verifique em qual transi&#xE7;&#xE3;o se d&#xE1; a perceptividade dos n&#xED;veis de quantiza&#xE7;&#xE3;o. Fa&#xE7;a coment&#xE1;rios explicativos. Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 61
• 62. Prof Kesede R Julio 7.3 Amostragem Al&#xE9;m do aumento ou diminui&#xE7;&#xE3;o dos n&#xED;veis de cinza da imagem, a sua resolu&#xE7;&#xE3;o, como j&#xE1; 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&#xED;veis de cinza), nem percebemos os efeitos da amostragem, por&#xE9;m ao diminuirmos a quantidade de pontos para 128x128, ou 64x64, come&#xE7;amos a sentir falta de pontos que representem pixels intermedi&#xE1;rios entre dois pontos. Dependendo da aplica&#xE7;&#xE3;o da visualiza&#xE7;&#xE3;o da imagem, isto pode ser conveniente, pois quanto menor a representa&#xE7;&#xE3;o, menor o espa&#xE7;o ocupado e melhor performance dos algoritmos que ser&#xE3;o executados sobre esta imagem. A fun&#xE7;&#xE3;o imresize(), permite-nos verificar este efeito de amostragem. 7.3.2 Laborat&#xF3;rio Leia a imagem original &gt;&gt; f=imread('lenina.ppm'); Mostre a imagem &gt;&gt; image(f); Fa&#xE7;a a amostragem da imagem original para 128x128 &gt;&gt; f128x128=imresize(f,[128 128]); Mostre a imagem &gt;&gt; image(f128x128); Fa&#xE7;a a amostragem da imagem original para 64x64 &gt;&gt; f64x64=imresize(f,[64 64]); Mostre a imagem &gt;&gt; image(f64x64); Fa&#xE7;a a amostragem da imagem original para 32x32 &gt;&gt; f32x32=imresize(f,[32 32]); Mostre a imagem &gt;&gt; image(f32x32); Computa&#xE7;&#xE3;o Gr&#xE1;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&#xF3;rios 7.3.2.1 Fa&#xE7;a os mesmos testes do laborat&#xF3;rio anterior, agora com uma foto sua. Os testes devem contemplar at&#xE9; 4 n&#xED;veis do tamanho da imagem. Verifique em qual n&#xED;vel de amostragem se d&#xE1; a perceptividade das bordas. Fa&#xE7;a coment&#xE1;rios explicativos Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 63
• 65. Prof Kesede R Julio 7.4.1 Laborat&#xF3;rio Leia e mostre a imagem original. &gt;&gt; f=imread('lenina.ppm'); &gt;&gt; imshow(f); Extraia o histograma da imagem e guarde em outra vari&#xE1;vel. Esta vari&#xE1;vel ser&#xE1; um vetor unidimensional. Mostre este vetor afim de certificar-se disto. &gt;&gt; figure, imhist(f(:,:,1)) Note que os valores de intensidade da imagem n&#xE3;o est&#xE3;o distribu&#xED;dos de maneira uniforme, ou seja, existem mais intensidades escuras que claras. Agora, melhore o contraste desta imagem atrav&#xE9;s da equaliza&#xE7;&#xE3;o de seu histograma. &gt;&gt; fhe=histeq(f(:,:,1)); &gt;&gt; figure, imshow(fhe); &gt;&gt; figure, imhist(fhe); Note que agora as intensidades dos pixels est&#xE3;o melhores distribu&#xED;das no range de 0 a 255 e a imagem est&#xE1; mais clara, deixando os detalhes da imagem mais n&#xED;tidos 7.4.2 Relat&#xF3;rios Refa&#xE7;a o laborat&#xF3;rio, agora utilizando sua foto. O que voc&#xEA; pode concluir pelo histograma? A equaliza&#xE7;&#xE3;o melhora ou n&#xE3;o a visualiza&#xE7;&#xE3;o de detalhes? Fa&#xE7;a coment&#xE1;rios explicativos. 7.5.Thresholding O thresholding (limiariza&#xE7;&#xE3;o) &#xE9; a forma mais simples de segmenta&#xE7;&#xE3;o de uma imagem. Claro que nem sempre &#xE9; suficiente, por&#xE9;m &#xE9; bastante utilizada quando queremos binarizar uma imagem, afim de separar uma determinada &#xE1;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&#xE9;dia, por exemplo, &#xE9; um bom thresholding. Existem v&#xE1;rias t&#xE9;cnicas para decidir o seu valor, no entanto, faremos apenas alguns testes para entender o seu significado. Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 65
• 66. Prof Kesede R Julio 7.5.1 Laborat&#xF3;rio Leia e mostre a imagem &gt;&gt;&gt; f=imread('lenina.ppm'); &gt;&gt;&gt; imshow(f) Podemos converter a imagem de rgb para n&#xED;vel de cinza usando a fun&#xE7;&#xE3;o rgb2gray(), assim como extrair a m&#xE9;dia das intensidades atrav&#xE9;s da fun&#xE7;&#xE3;o mean2(), que no caso da lenina &#xE9; 61. Aplique o thresholding usando a m&#xE9;dia e mostre a imagem. &gt;&gt; fg=rgb2gray(f); &gt;&gt; mean2(fg) &gt;&gt; f61=fg&gt;61; &gt;&gt; imshow(f61) Agora, aplicamos um limiar de 30. &gt;&gt;&gt; f30=fg&gt;30; &gt;&gt;&gt; imshow(f30) E agora de 90. &gt;&gt;&gt; f90=fg&gt;90; &gt;&gt;&gt; imshow(f90) Imagem original Imagem c/ trhesholding de 30 Imagem c/ trhesholding de 61 (m&#xE9;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&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 66
• 67. Prof Kesede R Julio caracter&#xED;sticas originais da imagem, &#xE9; o valor m&#xE9;dio, por&#xE9;m as vezes desejamos destacar uma determinada particularidade, mais escura ou mais clara. Podemos tamb&#xE9;m usar v&#xE1;rios valores de thresholding em uma &#xFA;nica imagem, caso queiramos separar objetos de luminosidade diferentes. Nisto o histograma da imagem pode ser uma boa ferramenta de an&#xE1;lise para sabermos como est&#xE3;o distribu&#xED;das as intensidades dos objetos na imagem. 7.5.2 Laborat&#xF3;rio Primeiramente lemos a imagem do disco, guardamos na vari&#xE1;vel f e visualizamos a imagem. &gt;&gt; f=imread('keyb.pgm'); &gt;&gt; imshow(f) Convertemos a imagem para n&#xED;vel de cinza. &gt;&gt; f=rgb2gray(f); Depois disto, extra&#xED;mos o histograma da imagem. &gt;&gt; figure,imhist(f); podemos observar uma concentra&#xE7;&#xE3;o de valores em torno dos intervalos 20-50 e 150-180 e tamb&#xE9;m em torno do 255. Com isso, podemos entender que se passarmos thresholding por estes valores, partes significativas da imagem poder&#xE1; ser destacada. &gt;&gt; teclas=f&gt;20 &amp; f&lt;50; &gt;&gt; imshow(teclas) claro que com alguns ajustes podemos melhorar aquilo que queremos destacar. &gt;&gt; fundo=f&gt;150 &amp; f&lt;180; &gt;&gt; imshow(fundo) at&#xE9; mesmo intuitivamente podemos perceber que os valores 255 s&#xE3;o os n&#xFA;meros das teclas. &gt;&gt; nr=f==255; &gt;&gt; imshow(nr) Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 67
• 68. Prof Kesede R Julio Imagem original Histograma Im. Orig teclas fundo n&#xFA;meros 7.5.2 Relat&#xF3;rio Escolha uma imagem com, pelo menos, dois objetos (gr&#xE3;os de arroz e de milho, por exemplo) separ&#xE1;veis pelo m&#xE9;todo visto no laborat&#xF3;rio 7.5.2. Refa&#xE7;a o procedimento do laborat&#xF3;rio (usando o histograma para separar os objetos), agora considerando esta imagem. Fa&#xE7;a coment&#xE1;rios explicativos sobre cada opera&#xE7;&#xE3;o. 5.6 Filtros A id&#xE9;ia de filtro (m&#xE1;scara, template etc) &#xE9; executar uma opera&#xE7;&#xE3;o sobre uma imagem afim de modific&#xE1;-la. Esta opera&#xE7;&#xE3;o &#xE9; realizada utilizando-se a vizinhan&#xE7;a de cada pixel da imagem, assim como uma matriz (m&#xE1;scara, geralmente 3x3) com um pixel central determinado, o qual ser&#xE1; a refer&#xEA;ncia para a opera&#xE7;&#xE3;o de cada pixel da imagem. Os valores desta matriz &#xE9; que definir&#xE1; a imagem resultante. A vizinhan&#xE7;a de um pixel depende da abordagem da opera&#xE7;&#xE3;o. Podemos ter vizinhan&#xE7;a 8 ou 4. Estes n&#xFA;meros definem a quantidade de pixels que ser&#xE3;o considerados na opera&#xE7;&#xE3;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&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 68
• 70. Prof Kesede R Julio Os filtros passa-baixa permitem que baixas frequ&#xEA;ncias (pequena ou nenhuma mudan&#xE7;a em valores de pixels pr&#xF3;ximos) permane&#xE7;am na imagem, eliminado as altas frequ&#xEA;ncias. Os filtros passa-faixa permitem que faixas de frequ&#xEA;ncias permane&#xE7;am na imagem, eliminado as que estiverem fora da faixa. Este tipo de filtro tem seu uso bem espec&#xED;fico. Cada tipo de filtragem requer mudan&#xE7;as dos valores e tamanho dos filtros. Mostramos abaixo alguns destes filtros. Filtro de M&#xE9;dia (passa-baixa) Este tipo de filtro &#xE9; constru&#xED;do atribuindo-se 1 para todos os coeficientes da m&#xE1;scara e dividindo-se cada um deles pelo total de coeficientes. Quanto maior a m&#xE1;scara maior a redu&#xE7;&#xE3;o do contraste e a perda da defini&#xE7;&#xE3;o da imagem. Por exemplo, em uma m&#xE1;scara 3x3, seria: h= 1 9 . [ 1 1 1 1 1 1 1 1 1] Filtro Gaussiano (passa-baixa) Este filtro &#xE9; uma aproxima&#xE7;&#xE3;o digital da fun&#xE7;&#xE3;o gaussiana. &#xC9; muito utilizado para reduzir ru&#xED;dos na imagem, pois preserva mais os contornos que o filtro de m&#xE9;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&#xE7;&#xE3;o deste filtro permite real&#xE7;ar as bordas da imagem atrav&#xE9;s de 2 filtros, um horizontal, outro vertical. O objetivo disto &#xE9; destacar altas frequ&#xEA;ncias nos dois sentidos. Os dois filtros, s&#xE3;o: hh= [ &#x2212;1 &#x2212;2 &#x2212;1 0 0 0 1 2 1 ] Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 70
• 71. Prof Kesede R Julio hv= [ &#x2212;1 0 1 &#x2212;2 0 2 &#x2212;1 0 1] Al&#xE9;m destes, diversos filtros poderiam ser constru&#xED;dos para aplica&#xE7;&#xF5;es diferentes. O Matlab, atrav&#xE9;s da fun&#xE7;&#xE3;o fspecial(&lt;filtro&gt;), permite a constru&#xE7;&#xE3;o de v&#xE1;rios deles: Filtro Descri&#xE7;&#xE3;o 'gaussian' Gaussiano 'sobel' Sobel com enfase horizontal 'prewitt' Prewitt com enfase horizontal 'laplacian' Laplaciano 'log' Laplaciano do filtro Gaussiano 'average' M&#xE9;dia 'unsharp' Unsharp (aumento de contraste) 5.6.1 Laborat&#xF3;rio Vamos trabalhar primeiro com imagens pequenas para verificarmos melhor os efeitos do filtro nos valores da imagem. A fun&#xE7;&#xE3;o &#x201C;magic&#x201D; cria uma matriz quadrada de n&#xFA;meros aleatorios. Usaremos esta fun&#xE7;&#xE3;o para simularmos nossa imagem. &gt;&gt; im=magic(4) Criamos agora um filtro h com valor negativo. &gt;&gt; h=[-1 0 1] Aplicamos o filtro a imagem. &gt;&gt; imf=imfilter(im,h) Para que voc&#xEA; confira seu entendimento, fa&#xE7;a os c&#xE1;lculos na m&#xE3;o de pelo menos um dos pixels e valide seus c&#xE1;lculos com o resultado do imfilter. Em uma imagem real o tipo dos valores s&#xE3;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 &#xE9; uint8 e os resultados forem fracion&#xE1;rios, os valores decimais ser&#xE3;o desconsiderados. Leia a imagem do arquivo e mostre-a. &gt;&gt; f=imread('cookies.pgm'); &gt;&gt; imshow(f) Crie um filtro de m&#xE9;dia. Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 71
• 72. Prof Kesede R Julio &gt;&gt; h=ones(3)/9 Aplique o filtro sobre a imagem &gt;&gt;fh=imfilter(f,h) Mostre as duas imagens em um mesmo figure. &gt;&gt; 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 &#xE9; passado em cada canal de cor. 5.6.2 Relat&#xF3;rios 1. Fa&#xE7;a laborat&#xF3;rio acima (filtro de m&#xE9;dia) com uma imagem n&#xED;vel de cinza (2D) e uma colorida (3D). 2. Escolha uma imagem com ru&#xED;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&#xE1;tica A morfologia pode ser aplicada para realce de imagens, esqueletiza&#xE7;&#xE3;o, segmenta&#xE7;&#xE3;o, filtragem etc. As opera&#xE7;&#xF5;es morfol&#xF3;gicas consistem na rela&#xE7;&#xE3;o das imagens com formas menores e especificamente definidas chamadas elemento estruturante, atrav&#xE9;s da teoria dos conjuntos. Temos duas opera&#xE7;&#xF5;es morfol&#xF3;gicas principais: dilata&#xE7;&#xE3;o e eros&#xE3;o. A dilata&#xE7;&#xE3;o (Uni&#xE3;o) acrescenta uma &#xE1;rea na imagem atrav&#xE9;s de uma forma padr&#xE3;o (Elemento Estruturante). A eros&#xE3;o Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 72
• 73. Prof Kesede R Julio (Intersec&#xE7;&#xE3;o) exclui da imagem formas que n&#xE3;o atendam a um determinado padr&#xE3;o (Elemento Estruturante). Estas opera&#xE7;&#xF5;es podem ser realizadas sobre imagens bin&#xE1;rias, tons de cinza ou coloridas, por&#xE9;m em cada uma delas o significado ser&#xE1; diferente. Veremos apenas opera&#xE7;&#xF5;es morfol&#xF3;gicas em imagens bin&#xE1;rias e tons de cinza. 5.7.1 Dilata&#xE7;&#xE3;o A dilata&#xE7;&#xE3;o sempre aumenta o tamanho da imagem, pois a opera&#xE7;&#xE3;o realizada &#xE9; de Uni&#xE3;o. Abaixo ser&#xE1; mostrado o processo de dilata&#xE7;&#xE3;o bin&#xE1;ria. B = {(0,0), (1,0)} A marca&#xE7;&#xE3;o do primeiro pixel na imagem denota a origem da imagem e a marca&#xE7;&#xE3;o do pixel no Elemento Estruturante denota o seu centro. 5.7.2 Eros&#xE3;o A eros&#xE3;o sempre diminui o tamanho da imagem, pois a opera&#xE7;&#xE3;o realizada &#xE9; de intersec&#xE7;&#xE3;o. Abaixo ser&#xE1; mostrado alguns exemplos de eros&#xE3;o. Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 73
• 74. Prof Kesede R Julio O conjunto de pontos resultantes da eros&#xE3;o &#xE9; a o conjunto de pontos que interceptam totalmente A e B. 5.7.3 Abertura Uma Abertura Morfol&#xF3;gica &#xE9; uma eros&#xE3;o seguida imediatamente de uma dilata&#xE7;&#xE3;o com mesmo elemento estruturante. Ela tende a abrir pequenos espa&#xE7;os vazios entre objetos da imagem muito pr&#xF3;ximos. Tamb&#xE9;m pode ser usada para eliminar ru&#xED;dos na imagem. Veja o exemplo abaixo. 5.7.4 Fechamento Um Fechamento Morfol&#xF3;gico &#xE9; uma dilata&#xE7;&#xE3;o seguida imediatamente de uma eros&#xE3;o com mesmo elemento estruturante. Ele tende a eliminar buracos na imagem, ou seja, fecha espa&#xE7;os vazios. Tamb&#xE9;m pode ser usada para eliminar ru&#xED;dos na imagem. Veja o exemplo abaixo. Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 74
• 75. Prof Kesede R Julio 5.7.5 Morfologia em Tons de Cinza A id&#xE9;ia aqui se modifica um pouco devido aos valores da imagem. O que &#xE9; Uni&#xE3;o, passa a ser o valor m&#xE1;ximo. O que &#xE9; Intersec&#xE7;&#xE3;o passa a ser o valor m&#xED;nimo. Abaixo est&#xE3;o algumas imagens n&#xED;vel de cinza onde foram aplicadas cada opera&#xE7;&#xE3;o morfol&#xF3;gica vista. 5.7.6 Laborat&#xF3;rio Vamos agora praticar o uso das ferramentas morfol&#xF3;gicas. Comecemos pela dilata&#xE7;&#xE3;o. Leia a imagem text.png. &gt;&gt; textobw = imread('text.png'); Agora crie um EE de linha vertical (90&#xBA;) de tamanho de 22 pixels. &gt;&gt; ee = strel('line',11,90); Use o EE criado para dilatar a imagem e mostre a imagem original e a dilatada. &gt;&gt; textobw2 = imdilate(textobw,ee); &gt;&gt; imshow(textobw), title('Original') &gt;&gt; figure, imshow(textobw2), title('Dilatado') Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 75
• 76. Prof Kesede R Julio Fa&#xE7;a uma dilata&#xE7;&#xE3;o com a imagem cameraman.tif. Leia a imagem. &gt;&gt; fotografo = imread('cameraman.tif'); Crie um EE de uma bola de raio 5. &gt;&gt; ee = strel('ball',5,5); Fa&#xE7;a a dilata&#xE7;&#xE3;o da imagem usando o EE criado. &gt;&gt; fotografo2 = imdilate(fotografo,ee); Mostre as duas imagens (original e dilatada). &gt;&gt; imshow(fotografo), title('Original') &gt;&gt; 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&#xE7;a (considerada pela forma do EE). Computa&#xE7;&#xE3;o Gr&#xE1;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&#xE3;o em uma imagem bin&#xE1;ria e depois em uma tom de cinza. Leia a imagem bin&#xE1;ria circles.png e mostre-a. &gt;&gt; circulosBW = imread('circles.png'); &gt;&gt; imview(circulosBW) Perceba que os c&#xED;rculos est&#xE3;o sobrepostos. A fun&#xE7;&#xE3;o imview() &#xE9; uma outra forma de mostrar imagens (experimente as ferramentas da janela). Vamos agora construir o Elemento Estruturante atrav&#xE9;s da fun&#xE7;&#xE3;o strel(). Neste caso, &#xE9; constru&#xED;do um disco de 11 pixels de raio. (Acesse o help do Matlab para verificar as diversas possibilidades de constru&#xE7;&#xE3;o do EE atrav&#xE9;s do strel()). Voc&#xEA; n&#xE3;o precisa, necessariamente, usar o strel(). Voc&#xEA; pode construir seu EE atrav&#xE9;s de uma matriz qualquer. ee = strel('disk',11); Vamos agora, erodir a image e mostr&#xE1;-las (original e erodida) para compara&#xE7;&#xE3;o. circErodBW = imerode(circulosBW,ee); imview(circulosBW), imview(circErodBW) Perceba que agora temos os c&#xED;rculos separados, o que facilita muito uma eventual an&#xE1;lise destes objetos. Imagem (bin&#xE1;ria) original Imagem Erodida Experimente agora erodir uma imagem n&#xED;vel de cinza utilizando o script abaixo: fotografo= imread('cameraman.tif'); ee = strel('ball',5,5); % constr&#xF3;i uma bola de raio 5 Computa&#xE7;&#xE3;o Gr&#xE1;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&#xE7;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&#xE7;a (considerada pela forma do EE). 5.8 Estudo de Casos Aqui estaremos listando algumas aplica&#xE7;&#xF5;es pr&#xE1;ticas de processamento de imagens. A id&#xE9;ia &#xE9; que voc&#xEA; possa utilizar as ferramentas aqui descritas para as suas pr&#xF3;prias aplica&#xE7;&#xF5;es. 5.8.1 An&#xE1;lise de gr&#xE3;os de arroz Primeiramente vamos ler a imagem do disco e mostr&#xE1;-la em tela. Atrav&#xE9;s do seu tamanho (size), podemos constatar ser uma imagem n&#xED;vel de cinza. &gt;&gt; arroz=imread('rice.png'); &gt;&gt; imshow(arroz) &gt;&gt; size(arroz) Devido ao fundo da imagem ser irregular, podemos aplicar uma subtra&#xE7;&#xE3;o do fundo afim de equaliz&#xE1;-lo. Primeiramente, criaremos uma imagem sem os gr&#xE3;os de arroz atrav&#xE9;s de uma abertura morfol&#xF3;gica. &gt;&gt; fundo = imopen(arroz,strel('disk',15)); &gt;&gt; figure, imshow(fundo) Computa&#xE7;&#xE3;o Gr&#xE1;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&#xE7;&#xE3;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&#xE3;os, de tal forma que n&#xE3;o consiga ser colocado totalmente dentro de nenhum deles. Desta forma removemos os gr&#xE3;os de arroz conforme mostra a imagem. Agora podemos subtrair o fundo da imagem original, ficando assim os gr&#xE3;os de arroz sobre uma superf&#xED;cie totalmente preta. &gt;&gt; arroz2 = imsubtract(arroz,fundo); &gt;&gt; figure, imshow(arroz2) Podemos ent&#xE3;o melhorar o contraste desta imagem, usando a fun&#xE7;&#xE3;o imadjust(). &gt;&gt; arroz3 = imadjust(arroz2); &gt;&gt; figure, imshow(arroz3) Apesar de estar bem destacado o que queremos (gr&#xE3;os de arroz), ainda temos uma imagem n&#xED;vel de cinza. Podemos agora binarizar esta imagem usando thresholding. A fun&#xE7;&#xE3;o graythresh() calcula um valor apropriado para fazer a convers&#xE3;o de n&#xED;vel de cinza para bin&#xE1;rio. A fun&#xE7;&#xE3;o im2bw() binariza uma imagem n&#xED;vel de cinza considerando o valor do limiar. &gt;&gt; limiar = graythresh(arroz3); &gt;&gt; arrozbw = im2bw(arroz3,limiar); &gt;&gt; figure, imshow(arrozbw) Na imagem binarizada podemos aplicar a fun&#xE7;&#xE3;o bwlabel() que contar&#xE1; quantos componentes existem na imagem (numObjects), al&#xE9;m de rotular numericamente (arrozRot), cada um dos componentes. Estes resultados depender&#xE3;o de alguns fatores, como: 1) tamanho dos componentes; 2) componentes que se tocam formando um &#xFA;nico componente; 3) tipo de conectividade, neste caso, 4. &gt;&gt; [arrozRot,numObjetos] = bwlabel(arrozbw,4); &gt;&gt; numObjetos numObjetos = 101 Isto mostra que temos 101 gr&#xE3;os de arroz na imagem. A imagem pode ser vista atrav&#xE9;s da visualiza&#xE7;&#xE3;o de cores sint&#xE9;ticas para cada componente usando label2rgb(). &gt;&gt; pseudo_color = label2rgb(arrozRot, @spring, 'c', 'shuffle'); &gt;&gt; imshow(pseudo_color); Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 79
• 80. Prof Kesede R Julio Abaixo podemos ver as imagens geradas pela fun&#xE7;&#xE3;o imshow() resultante de cada uma das opera&#xE7;&#xF5;es vistas at&#xE9; aqui. Imagem original (imread()) Remo&#xE7;&#xE3;o dos gr&#xE3;os de arroz (imopen()) Imagem com fundo regular (imsubtract()) Melhora de contraste (imadjust()) Imagem binarizada (imbw()) Imagem colorida sinteticamente (label2rgb()) Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 80
• 81. Prof Kesede R Julio Al&#xE9;m de contar componentes, podemos tamb&#xE9;m extrair algumas informa&#xE7;&#xF5;es destes componentes, atrav&#xE9;s da fun&#xE7;&#xE3;o regionprops(), que retornar&#xE1; em uma estrutura, a &#xE1;rea (em pixels), o centro de massa e o ret&#xE2;ngulo que envolve (bounding box) cada um dos componentes. &gt;&gt; arrozDados = regionprops(arrozRot,'basic') arrozDados = 101x1 struct array with fields: Area Centroid BoundingBox Assim, para sabermos o valor da &#xE1;rea do 10&#xBA; componente da imagem, seu centroid e o ret&#xE2;ngulo que o envolve, usamos: &gt;&gt;arrozDados(10).Area ans = 176 &gt;&gt; arrozDados(10).BoundingBox ans = 9.5000 86.5000 25.0000 17.0000 &gt;&gt; arrozDados(10).Centroid ans = 21.3693 95.9716 Dado o valor da &#xE1;rea de cada componente (arrozDados.Area), algumas quest&#xF5;es estat&#xED;sticos podem ser levantadas, como: Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 81
• 82. Prof Kesede R Julio Qual o tamanho do maior gr&#xE3;o? &gt;&gt; max([arrozdados.Area]) ans = 404 Qual o gr&#xE3;o de maior tamanho? &gt;&gt; maiorgrao = find([graindata.Area]==404) maiorgrao = 59 Qual a m&#xE9;dia dos tamanhos dos gr&#xE3;os? &gt;&gt; mean([graindata.Area]) ans = 175.0396 5.9 Reconhecimento de Padr&#xF5;es O reconhecimento de Padr&#xF5;es de imagem sugere a identifica&#xE7;&#xE3;o de padr&#xF5;es ou objetos dentro de uma determinada imagem. As t&#xE9;cnicas envolvidas permitem a classifica&#xE7;&#xE3;o dos objetos determinando sua separabilidade. Um sistema de RP deveria ser capaz de extrair informa&#xE7;&#xF5;es a partir de um conjunto de informa&#xE7;&#xF5;es irrelevantes, aprender por exemplos e generalizar o conhecimento para outros contextos, inferir informa&#xE7;&#xF5;es a partir de informa&#xE7;&#xF5;es incompletas. Sabemos que nossa intelig&#xEA;ncia tem esta capacidade, por&#xE9;m para um computador a tarefa fica mais dif&#xED;cil. Estas dificuldades acabam por gerar sistema super-especialistas. Podemos dividir a tarefa de identifica&#xE7;&#xE3;o em processamento de tr&#xEA;s n&#xED;veis: baixo, m&#xE9;dio e alto. No n&#xED;vel baixo temos a captura da imagem (fotografia, escaneamento, imagem por sat&#xE9;lite etc) atrav&#xE9;s de um sensor e um pr&#xE9;-processamento na imagem (contraste, ru&#xED;do, ajustes etc) para melhorar a performance do sistema. No n&#xED;vel m&#xE9;dio podemos aplicar processos de separa&#xE7;&#xE3;o das &#xE1;reas de interesse (segmenta&#xE7;&#xE3;o), assim como determinar sua representa&#xE7;&#xE3;o (vetor, &#xE1;rvore etc). Esta fase pode exigir alguma intelig&#xEA;ncia do sistema, como por exemplo, encontrar picos, texturas etc. J&#xE1; em alto n&#xED;vel temos efetivamente o processo de reconhecimento atrav&#xE9;s de compara&#xE7;&#xE3;o com padr&#xF5;es pr&#xE9;-estabelecidos ou n&#xE3;o (sistemas aut&#xF4;matos). Aqui Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 82
• 83. Prof Kesede R Julio os resultados s&#xE3;o interpretados e mostrados ao usu&#xE1;rio que poder&#xE1; aplicar uma valida&#xE7;&#xE3;o para garantir a implanta&#xE7;&#xE3;o ou n&#xE3;o do sistema. A intelig&#xEA;ncia do sistema nesta fase &#xE9; fortemente exigida, uma vez que quanto menos aplicada, menos autom&#xE1;tico ser&#xE1; o reconhecimento. A figura abaixo mostra uma estrutura b&#xE1;sica de RP. Computa&#xE7;&#xE3;o Gr&#xE1;fica e Processamento de Imagem 83 Pr&#xE9;-processamento Captura da imagem Segmenta&#xE7;&#xE3;o Representa&#xE7;&#xE3;o Base de conhecimento Reconhecimento N&#xED;vel Baixo N&#xED;vel M&#xE9;dio N&#xED;vel Alto Problema Resultado