Baixe o app para aproveitar ainda mais
Prévia do material em texto
1 Aula 4.1 Realce de características (Operações aritméticas pontuais) Curva de Tons, Curva Gamma Realce de Características da Imagem (Pré-processamento no domínio espacial). Podemos destacar certas características da imagem com procedimentos que operam diretamente sobre os pixels de uma imagem, na forma como estão arranjados espacialmente. Matematicamente, uma operação de processamento espacial é denotada da seguinte forma: g(x,y) = T [f (x,y)] onde f (x,y) representa a imagem de entrada, g(x,y) representa a imagem de saída realçada, e T é um operador em f , definido para atuar sobre um ponto (pixel) ou sobre sua vizinhança. T é também denominada de FUNÇÃO DE TRANSFERÊNCIA. As operações que T promove sobre os pixels da imagem podem ser ARITMÉTICAS ou LÓGICA, PONTUAIS ou DEPENDENTES DA VIZINHANÇA DO PIXEL (também denominado de filtragem no domínio espacial). Veremos as operações dependentes da vizinhança nos próximos módulos. Por ora nos limitaremos a algumas as operações básicas que são aplicadas diretamente sobre pixels individuais. As mais comuns são: IDENTIDADE: Apenas uma referência. Nada mais do que uma cópia idêntica, ponto a ponto da imagem original. g(x,y) = f (x,y) Um fragmento de código C para este tipo de transformação pode ser visto a seguir: for (int y = 0; y < altura_da_imagem; y++) for (int x = 0; x < largura_da_imagem; x++) g(x,y) = f(x,y); NEGATIVA: a negativa de uma imagem f é obtida ao inverter-se a intensidade luminosa de todos os pontos da imagem, resultando em uma nova imagem g com aspecto semelhante a um negativo fotográfico. Ou seja, para uma imagem f com uma faixa de tons de cinza variando de [0, L−1], a negativa desta imagem é obtida pela expressão: g(x,y) = (L−1)− f (x,y). Esta operação é adequada para destacar pequenos detalhes brancos ou cinza sobre grandes áreas negras. int L = 226; // 256 Niveis de cinza for (int y = 0; y < altura_da_imagem; y++) for (int x = 0; x < largura_da_imagem; x++) g(x,y) = (L-1) - f(x,y); 2 LOGARÍTMICA: esta operação aplica uma transformação logarítmica a cada ponto de uma imagem f, conforme a expressão: g(x,y) = c.log(1+ f (x,y)), onde c é uma constante definida em função dos níveis de cinza. O fragmento de C a seguir ilustra a codificação da transformação logarítmica da imagem para 256 níveis de cinza. double c = 255 / log(256); for (int y = 0; y < altura_da_imagem; y++) for (int x = 0; x < largura_da_imagem; x++) g(x,y) = c*log(1+f(x,y)); Esta operação normalmente mapeia uma faixa de baixos valores de intensidade luminosa para faixas maiores, TORNANDO VISÍVEIS PARTES DA IMAGEM QUE SE ENCONTRAVAM MUITO ESCURAS. POTÊNCIA: esta operação aplica uma transformação de potência a cada ponto de uma imagem f, conforme a expressão: g(x,y) = c.(f(x,y)) β , onde c é uma constante e > 0 é a potência a qual se deseja elevar o nível de intensidade luminosa de f (x,y). Funciona de forma semelhante à logarítmica, normalmente realçando pontos de baixa intensidade luminosa, mas isso depende de se é maior ou menor que 1. double c = 255 / pow(256,expoente); for (int y = 0; y < altura_da_imagem; y++) for (int x = 0; x < largura_da_imagem; x++) g(x,y) = c*pow(f(x,y),expoente); Por razões prática, é conveniente NORMALIZAR f(x,y) para assumir valores REAIS entre 0, e 1. Ou seja 0 ≤ f(x,y) ≤ 1. A NORMALIZAÇÃO evita que nos preocupemos com a quantização, isto é, com a quantidade de níveis de cinza da imagem. Para "desnormalizarmos" a imagem, basta multiplicarmos seu valor por L − 1 e aproximarmos o resultado para o inteiro mais próximo. As figuras a seguir, de PAVIM e ROLOFF(2005), ilustra as 4 transformações mostradas acima. 3 Figura 1. Variação da imagem quando aplicamos operações básicas de pré-processamento pontual de IDENTIDADE, NEGATIVO, LOGARITMO E POTÊNCIA (= 0,5). A Curva de Tons Chama-se CURVA DE TONS o gráfico f x g, onde f representa a imagem original, de entrada, e g a imagem final, de saída. Trata-se de um recurso visual muito comum em quase todos os programas de processamento de imagem que permite visualizar, e mesmo modelar interativamente, o operador T. 0.0 0.5 1.0 0.0 0.5 1.0 f(x,y) g (x ,y ) 0.0 0.5 1.0 0.0 0.5 1.0 f(x,y) g (x ,y ) 0.0 0.5 1.0 0.0 0.5 1.0 f(x,y) g (x ,y ) 0.0 0.5 1.0 0.0 0.5 1.0 f(x,y) g (x ,y ) Figura 2. CURVAS DE TONS para as operações básicas mostradas acima (IDENTIDADE, NEGATIVO, LOGARITMO E POTÊNCIA (= 0,5)). Note que f e g estão NORMALIZADAS. g = f g = 1 f g = log2(1+f) g = f Identidade Negativo Logaritmica Potëncia ( = 0.5) 4 Figura 3. Exemplo de ferramenta que utilize a CURVA DE TONS para modelar a FUNÇÃO DE TRANSFERÊNCIA (T). A esquerda do Adobe Photoshop(R), ao centro do Aldus PhotoStyler 2.0 e a direita do GIMP (Gnu Image Maniputalion Program). EXEMPLO DE MODELAGEM SIMPLES (LINEAR) DA CURVA DE TONS. Vamos considerar o problema de construirmos uma FUNÇÃO DE TRANSFERÊNCIA a partir de uma CURVA DE TONS. A gráfico g = T(f) pode ser representado por uma FUNÇÃO LINEAR: g = a.f + b Onde a é o COEFICIENTE ANGULAR e b é o COEFICIENTE LINEAR. Note que quando a = 1, a inclinação da reta não muda. Neste caso, g = f + b b consiste em somarmos (ou subtrairmos) um valor constante a f, o que implicará em um AUMENTO (soma) ou DIMINUIÇÃO (subtração) GLOBAL do BRILHO da imagem destino g. Como f e g estão normalizadas, -1 b 1. O gr[afico a seguir ilustra exemplos de aumento e diminuição de brilho da imagem representados na curva de tons. Figura 4. Curva de tom original (identidade) e alteradas, com suas imagens transformadas e histogramas. (CONCI, 2008) 5 Figura 5. Exemplo de AUMENTO de BRILHO (esquerda) e DIMINUIÇÃO de BRILHO (direita) na CURVA DE TONS. Note que o valor f = 0,5 aumentou para g = 0,7 no gráfico da esquerda e diminuiu para g = 0,3 no gráfico da esquerda. Por outro lado, o valor de a implica na alteração do CONTRASTE da imagem. Acompanhe nos gráficos a seguir: 0.0 0.5 1.0 0.0 0.5 1.0 f(x,y) g (x ,y ) 0.0 0.5 1.0 0.0 0.5 1.0 f(x,y) g (x ,y ) Figura 6. Exemplo de AUMENTO de CONTRASTE (esquerda) e DIMINUIÇÃO de CONTRASTE (direita) na CURVA DE TONS. Note que o uma pequena variação de tons em f foi expandida em g no gráfico da esquerda, tornando o histograma mais largo, e comprimiu no gráfico da direita, fazendo com que o histograma se tornasse mais estreito. A Curva Gamma A CURVA GAMMA, ou CORREÇÃO GAMMA (), é uma espécie de "coringa" para ajustar os níveis de cinza (meios-tons) buscando uma melhor resposta perceptiva à imagem. Ou seja, trata-se de uma transformação não linear que altera os valores da luminância da imagem original obtendo uma melhor resposta na saída de um dispositivo em particular. Você pode usar a curva gamma para corrigir imagens a serem representadas por dispositivos diferentes, como entre a visão, cuja resposta ao estímulo é logarítmica, e uma imagem capturada por uma CCD, cuja resposta é, em geral, linear; ou ainda corrigir uma imagem para que sua impressão se torne mais nítida. No caso mais simples, a curva gamma é definida por uma função do tipo: γ 1 rs , onde r representa os valores originais de níveis de cinza, normalizados na faixa de 0 a 1, e srepresenta os valores de níveis de cinza da imagem final. Na prática, a CORREÇÃO GAMMA é a mesma OPERAÇÃO PONTUAL DE POTÊNCIA vista anteriormente. 0.0 0.5 1.0 0.0 0.5 1.0 f(x,y) g (x ,y ) 0.0 0.5 1.0 0.0 0.5 1.0 f(x,y) g (x ,y ) g = f + 0.2 0.7 g = f 0.2 0.3 g = 2f 0.5 g = 0,5f + 0.25 6 Aula 4.2 Representação e modelagem de objetos em duas e três dimensões. Representação de vértices, arestas e faces. Estrutura de dados baseada em vértices e arestas. Modelagem de objeto em aramado por seus vértices e arestas. Modelagem em 2D e 3D Para representarmos os objetos, imagens, em alguma área da tela de um computador (VIEWPORT), devemos ser capazes de definir os pontos que serão ligados por segmentos de retas. Esses pontos são denominados VÉRTICES e os segmentos de reta que os unem são as ARESTAS. Quase todas as linguagens de programação que manipulam gráficos possuem primitivas para unir os VÉRTICES de uma figura previamente mapeados como PIXELS na VIEWPORT (o mapeamento WINDOWS -To-VIEWPORT) em termos das coordenadas de seus vértices. Tais VÉRTICES podem ser obtidos por meio de funções matemáticas, mas é comum utilizarmos uma estrutura de dados que armazene os VÉRTICE, ARESTAS e FACES de um objeto primitivo. Nosso problema aqui é aprender como podemos fazer isso, como MODELAR e ARMAZENAR os VÉRTICS e as ARESTAS de um dado modelo simples (primitiva). O tratamento de FACES poderá ser tratado mais tarde, quando discorrermos sobre os algoritmos Z-BUFFER e RAY-TRACING. Usando-se um sistema cartesiano xyz podemos representar adequadamente esses valores e guardá- los em uma estrutura de dados conveniente (lista de vértices, arestas e faces) Consideraremos um sistema de eixos onde o eixo x é horizontal e positivo para a direita, o eixo y é vertical e positivo para cima e o eixo z é perpendicular a ambos, positivo na direção do produto vetorial e3 = e1 x e2, onde e1, e2 e e3 são os vetores unitários nas direções x, y e z, respectivamente (base). Esta orientação é denominada de SISTEMA DE MÃO DIREITA. Por exemplo: Um cubo de lado 1 com um dos vértices apoiado na origem do plano cartesiano será representado pela lista de vértices no SRO (ou no SRN) e aresta da seguinte forma (figura ao lado): Vértices V1 V2 V3 V4 V5 V6 V7 V8 Coordenadas (0,0,0) (1,0,0) (1,1,0) (0,1,0) (0,0,1) (1,0,1) (1,1,1) (0,1,1) Já as arestas serão dadas pelo par (VÉRTICE INICIAL, VÉRTICE FINAL) por: Arestas V1- V2 V2- V3 V3- V4 V4- V1 V1- V5 V2- V6 V3- V7 V4- V8 V5- V6 V6- V7 V7- V8 V8- V5 Neste caso podemos utilizar a notação de vetores (arrays). Um conjunto de vetores receberá a lista dos vértices armazenado em uma matriz 3 N (ou 2 N no caso de 2D), onde N é o número de vértices ordenados de 1 até N colunas e outro receberá a lista de arestas. Assim: x y z V1 V2 V3 V4 V5 V6 V7 V8 SRO 7 11110000 11001100 01100110 CUBOVERTICES Já os vetores de arestas serão armazenados em uma matriz 2 M, independentemente se o objeto é 2D ou 3D. As arestas são ordenadas em colunas de 1 até M. A primeira linha contém o índice do vértice inicial e a segunda o índice do vértice final. 587687651432 876543214321 CUBOARESTAS Esta forma de estruturar os vértices e as arestas de objetos não é única. Quando desenhamos na tela do computador um objeto modelado por seus vértices V = {V1, V2, V3, ..., Vn}, devemos primeiro transformar as coordenadas de cada VÉRTICE conforme a necessidade da representação (isto implica em transformações geométricas descritas no módulo 7 e transformações dos vértices resultantes do SRO SRU SRD, conforme vimos no módulo 2) e, em seguida, desenhar as ARESTAS ligando as coordenadas X e Y, em pixel, de cada um de seus vértices extremos. Por exemplo: Considere a aresta A1 que liga os vértices V1 e V2. Após efetuarmos uma série de cálculos para posicionar o objeto adequadamente no SRU e passá-lo para o SRD. Para desenhar o objeto em uma determinada viewport do dispositivo gráfico de saída, tomamos apenas os valores transformado das coordenadas Xpixel e Ypixel dos vértices V1 e V2 e os ligamos com um algoritmo de linhas (Bresenham), conforme visto no módulo 3. No presente módulo, contudo, iremos nos preocupar somente em como podemos criar uma estrutura de vértices e arestas para serem usadas oportunamente. 8 Aula 5.1 Transformações geométricas em duas e três dimensões Transformações de pontos (translação, reflexão, escala, rotação e cisalhamento). Concatenação de transformações geométricas. Coordenadas homogêneas. Transformações Geométricas em 3D Transformações Geométricas em 2D e 3D Quando se trata de gerar imagens em duas ou três dimensões, apenas o uso de primitivas mapeadas na VIEWPORT pode não ser suficiente. Podo correr a necessidade de que sejam feitas certas transformações. Por um lado, as transformações de primitivas facilitam a geração de imagens porque os objetos gráficos podem ser gerados (calculados) em sua forma mais simples, e depois alterados para a imagem final que se deseja. Por outro lado, a aplicação de transformações permite que se crie uma “linguagem comum” (como será visto a seguir) que unifica e generaliza as transformações. Na disciplina de Álgebra Linear aprendemos o que são transformações e como podemos distinguir as transformações lineares e não lineares através de operações algébricas de soma vetorial e produto de vetor por escalar. As transformações se aplicam igualmente a funções matrizes e vetores. Em Computação Gráfica preocupamo-nos sobretudo com as transformações geométricas, aplicadas a vetores e espaços vetoriais. As transformações geométricas básicas são: 1. Translação (T) 2. Reflexão (M) 3. Escala (S) 4. Rotação (R) 5. Cisalhamento (C) Dessas cinco transformações geométricas básicas apenas a transformação de translação é não-linear, todas as outras são lineares e, mais adiante, veremos a implicação desse fato de maneira bem dramática. Por ora considere a imagem de uma bandeira cujos vértices V, de coordenada (x, y), transformam- se em V', de coordenadas (x', y'), como passamos a descrever em cada caso, com as respectivas matrizes de transformação. 9 TRANSLAÇÃO A translação é o ato de levar um objeto de um ponto para outro, num sistema de referência. O objetivo de uma translação é bem simples: ao calcularmos os pontos de um objeto, devemos escolher a posição mais simples para sua geração – por exemplo, para um círculo fazer coincidir o centro com a origem dos eixos – e depois transferir a figura para a posição final. y x y x t t y x y x tyy txx ´ ´ ´ ´ ),(´ yx ttTVV Equação matricial p/ a transformação REFLEXÃO y x y x yy xx 10 01 ´ ´ ´ ´ (reflexão em y) VMV )1,1(´ Equação matricial p/ a transformação y x y x yy xx 10 01 ´ ´ ´ ´ (reflexão emx) VMV )1,1(´ Equação matricial p/ a transformação ESCALA Quando se aplica uma transformação de escala a um objeto, o resultado é um novo objeto semelhante ao original, mas "esticado" ou "encolhido". y x s s y x ysy xsx y x y x 0 0 ´ ´ ´ ´ VssSV yx ),(´ Equação matricial p/ a transformação ROTAÇÃO É o ato de girar um objeto de um ângulo, num sistema de referência. Como no caso da translação, objetivo de uma rotação é bem simples: ao modelar-se os pontos de um objeto, deve-se escolher o X X X Y Y Y (0, 0) x x x y y y x x' x+tx -y y' y+ty Reflexão em y Figura 3: Escala. Figura 1: Translação. Reflexão em x Figura 2: Reflexão. 10 ângulo mais simples para sua geração, e depois girar a figura para a posição final. Um rotação em duas dimensões é aplicada pelo reposicionamento de cada ponto original (calculado) do objeto ao longo de um círculo imaginário no plano xy. Logo, deve ser especificado um ângulo de rotação , que especifica o arco que um dado ponto deve ser deslocado em torno da origem do sistema de referência (0, 0). y x y x yxy yxx cossin sincos ´ ´ cossin´ sincos´ VRV )(´ Equação matricial p/ a transformação CISALHAMENTO (SHEAR) y x c c y x yxcy ycxx y x y x 1 1 ´ ´ ´ ´ VccCV yx ),(´ Equação matricial p/ a transformação CONCATENAÇÃO DE TRANSFORMAÇÕES (TRANSFORMAÇÕES COMPOSTAS) As transformações apresentadas acima são elementares, isto é, são aplicadas independemente umas das outras. Entretanto, no caso geral, as transformações devem ser consideradas como sendo aplicadas em conjunto. Por exemplo, quando se deseja rotacionar um objeto deslocado da origem em torno de um ponto arbitrário (x0 , y0), que chamaremos de PIVOT, se aplicarmos as expressões apresentadas, o mesmo sofrerá um aparente deslocamento ao longo do círculo imaginário de rotação centrado na origem (conforme mostra a figura 4). A seqüência que deve ser aplicada é 1) deslocar a figura de modo que o ponto PIVOT coincida com a origem das coordenadas; 2) aplicar a rotação no objeto deslocado; e 3) transladar a figura de volta para o local original. Concatenar transformações requer estratégia (lógica) e uma boa dose de visão espacial para se obter o resultado desejado. A sequência correta de transformações não é única e uma má escolha pode diminuir a eficiência do processo, tornando-o mais lento ou impreciso. Uma vez decidida qual a sequência adequada, devemos transformar os vértices do modelo, armazenados no vetor (ou matriz de vetores) V, em vértices transformados V' . Isto pode se feito de duas formas: 1) aplicando as transformações elementares uma a uma, o que é pouco eficiente, pois aumenta muito a quantidade de cálculos, diminuindo a precisão e aumentando o tempo de execução, ou 2) concatenando as matrizes das transformações elementares em uma única matriz de transformação, o que parece mais complicado, mas é muito mais eficiente. X X Y Y x x´ y' y x´ x y Figura 5: Cisalhamento Pivot Figura 4: Rotação. 11 EXEMPLO 1. Aplicando as transformações elementares uma a uma ao exemplo acima. Seja (x, y) a coordenada de um dos vértices do objeto. Seja, também, (x0, y0) a coordenada do pivot de rotação, que não precisa ser, necessariamente, um dos vértices do objeto. Então: 1. Translação do pivot para a origem (transformando (x, y) em (x', y')): 0 0 0 0 ' ' yy xx y x y x y x 2. Rotação de um ângulo (transformando (x', y') em (x'', y'')): cos)'(sin)'( sin)'(cos)'(cos'´sin sin'cos'''cossin sincos'''' 00 00 xxxx xxxx yx yx y x y x 3. Voltando ao ponto inicial (transformando (x'', y'') em (x''', y''')) 000 000 0 0 cos)'(sin)'( sin)'(cos)'( '' '' ''' ''' yxxxx xxxxx y x y x y x Ou seja, aplicando as expressões: 000 000 cos)'(sin)'(''' sin)'(cos)'(''' yxxxxy xxxxxx Obteremos o resultado esperado na figura 6, a rotação de ou objeto em torno de um ponto (x0, y0) . Note que as transformações de rotação, escala, reflexão e cisalhamento são matrizes multiplicativas, enquanto que a transformação de translação é uma matriz aditiva. Esta diferença nas operações X Y Ponto em torno do qual se deseja rotacionar X Y x0 y0 X Y X Y Centro de rotação X Y Translação do pivot para a origem (T1) Rotação (R) Translação de volta para o ponto inicial (T2) Aplicação direta da rotação (resultado indesejado) Aplicação concatenada (T2 R T1) (resultado desejado) Figura 6. Concatenação de transformações 12 dificulta a concatenação das transformações em uma única matriz. Isto ocorre justamente porque a transformação de translação é não linear, enquanto que as demais são lineares. A fim de contornar essa dificuldade usamos um artifício matemático que introduz as COORDENADAS HOMOGÊNEAS. O uso de coordenadas homogêneas facilita as aplicações de transformações sucessivas, pois todas as transformações podem ser resumidas numa única matriz, obtida pelo produto das matrizes de cada transformação independente. COORDENADAS HOMOGÊNEAS Considere a transformação de translação mostrada na figura 1. Introduzindo um coordenada extra, que chamaremos de z, podemos escrever a equação matricial da transformação da seguinte maneira: z y x t t z y x zyxz ztyxy ztyxx zz tyy txx y x y x y x 100 10 01 ' ' ' .10.0' ..1.0' ..0.1' ' ' ' Desta maneira, podemos transformar de uma vez por todas os vértices usando a equação matricial em coordenadas homogêneas: EXEMPLO 2. Concatenando as matrizes das transformações elementares em uma única matriz de transformação z y x yyx xyx z y x z y x y x y x z y x VyxTRyxTV homogêneasscoordenadaemçãoTransformadeMatriz000 000 0 0 0 0 0000 100 cossincossin sincossincos ' ' ' 100 10 01 100 0cossin 0sincos 100 10 01 ' ' ' ),()(),(' Cujo resultado final é o mesmo que o do exemplo 1 (como deveria ser), porém de uso mais eficiente e adequado para uso em programação. 13 V1 = (-1,-1) XP V2 = (-1, 1) YP V3 = (1,1) (0,0) V4 = (1,-1) (160,120) X (319,239) Y 30° Figura 7. Quadrado de lado 2 no SRU window EXEMPLO 3. Mapeamento WINDOW-TO-VIEWPORT usando transformações geométricas e coordenadas homogêneas No módulo 2 vimos como desenhar uma figura inscrita em uma janela (window) do SRU em uma janela de visualização (viewport) do dispositivo gráfico de saída (SRD). Para tanto usamos as relações de proporcionalidade, ou seja, uma regra de três simples. No exemplo a seguir faremos o mesmo trabalho usando os conceitos estudados no módulo 7. Vamos desenhar um quadrado de lado 2, centrado na origem do SRU (ou SRO), rotacionado de 30° centrado no meio da tela de um dispositivo de 320 x 230 pixels. Os vértices do quadrado no SRU (ou SRO) possuem coordenadas: V = {V1, V2, V3, V4 } e as arestas A = {(V1,V2), (V2,V3), (V3,V4), (V4,V1)} Usando a notação vista no módulo 6, podemos escrever as matrizes de vértices e arestas como: 1111 1111 1111 V 1432 4321 A As etapas da transformação são as seguintes: Rotação, Escala, Reflexão e Translação. Estas transformações deverão ser concatenadas e aplicadas a cada um dos vértices. 1. Transformação de Rotação: Primeiro iremos girar o objeto conforme desejamos usando a matriz homogênea de rotação em 2D: 100 086603,05,0 05,086603,0 100 030cos30sin 030sin30cos 100 0cossin 0sincos )30( R 2. Transformação de Escala: A escala depende das dimensões das janelas de visualização no espaço real e no espaço do dispositivo gráfico. Vamos considerar que o quadrado esteja limitado por uma window de dimensão 4 x 4, ou seja de (–2, –2) a (2, 2). A janela de visualização do dispositivo gráfico será a janela toda, ou seja, 320 x 240. Desta forma, para conter uma janela de dimensões 4 x 4 em outra de dimensões 320 x 240 os fatores de escala em X e Y serão 1 : - Fator de Escala em X: 320/4 = 80 - Fator de Escala em Y: 240/4 = 60 Assim, a matriz que representa o escalonamento do objeto dados será: 1 A rigor sx = 319/4 = 79.75 sy = 239/4 = 59.75 14 100 0600 0080 100 00 00 )60.80( y x s s S 2. Transformação de Reflexão: Como as ordenadas reais do SRU são crescente de baixo para cima e as coordenadas do dispositivo gráfico, SRD, são crescente de cima para baixo, devemos refletir verticalmente o objeto. Ou seja, a matriz que representa a reflexão em relação ao eixo X é: 100 010 001 )1,1(M 3. Transformação de Translação: Como a origem do dispositivo gráfico encontra-se no canto superior esquerdo, precisamos deslocar todo o objeto para o centro da janela de visualização, como queremos, cujas coordenadas são (160, 120). A matriz de transformação de translação em coordenadas homogêneas para este exemplo é: 100 12010 16001 )120,160(T FINALMENTE: Cada um dos vértices V = { V1, V2, V3, V4 } da figura original deverá ser transformado em vértices VP = { VP1, VP2, VP3, VP4 } do dispositivo gráfico pela relação: V V VRSMTVP 100 120962,5130 16040282,69 100 086603,05,0 05,086603,0 100 0600 0080 100 010 001 100 12010 16001 )30()60,80()1,1()120.160( 1111 0,14204,3804,980,202 3,2693,18972,507,130 1111 1111 1111 100 120962,5130 16040282,69 homogêneasscoordenadaemVérticesçãotransformadehomogêneaMatriz VP Observe que a matriz VP deve conter valores inteiros, pois são valores e pixels, então: 1111 1423898,202 26918951131 VP Assim, os vértices V foram transformados em VP Vértice V VP 1: (-1,-1) (131,202) 2: (-1, 1) ( 51, 98) 3: ( 1, 1) (189, 38) 4: ( 1,-1) (269,142) Que, uma vez ligados por um algoritmo de rasterização de linha, produz a figura abaixo. 15 XP YP (0,0) (160,120) (319,239) (189, 38) (51, 98) (131,202) (269,142) Note a distorção gerada pelo fato de que as janelas de visualização no espaço real e no espaço do dispositivo têm proporções diferentes. Como poderíamos corrigir essa distorção para obter a figura pretendida? TRANSFORMAÇÕES GEOMÉTRICAS EM 3D As transformações geométricas em 3D seguem os mesmos princípios vistos anteriormente. A principal diferença é que os modelos, agora, têm três coordenadas x, y e z e as transformações podem envolver os três eixos. Por exemplo, a transformação de rotação passa a ser considerada como rotação de um ângulo x em torno do eixo x, Rx(x), rotação de um ângulo y em torno do eixo y, Ry(y) e rotação de um ângulo z em torno do eixo z, Rz(z). As matrizes de transformação são matrizes 3x3 e, no caso das matrizes homogêneas, acrescenta-se a coordenada auxiliar w e as matrizes são de tipo 4x4. Segue abaixo as principais matrizes de transformação em coordenadas homogêneas (x, y, z, w) : TRANSLAÇÃO: 1000 100 010 001 ),,( z y x zyx t t t tttT ESCALA: 1000 000 000 000 ),,( z y x zyx s s s sssS ROTAÇÃO: 1000 0cossin0 0sincos0 0001 )( xx xx xxR 1000 0cos0sin 0010 0sin0cos )( yy yy yyR 1000 0cossin0 0sincos0 0001 )( xx xx xxR 16 Aula 5.2 Operações Aritméticas Orientadas à Vizinhanças Filtragem no Domínio Espacial (Máscaras) Máscaras de suavização (média e mediana) e aguçamento (laplaciano) Correlação x Convolução FILTRAGEM DE IMAGEM NO DOMÍNIO ESPACIAL (Operações aritméticas orientadas à vizinhança) Diferentemente do que vimos no módulo anterior, onde todos os pixels de uma imagem f(x,y) eram transformados segundo uma função T modelada sob a forma de uma CURVA DE TONS (gráfico de f contra g),sem dependerem do valor de pixels adjacentes, nas OPERAÇÕES ARITMÉTICAS ORIENTADAS À VIZINHANÇA cada pixels da imagem será modificado segundo seu próprio valor e em função dos valores dos pixels adjacentes. O resultado será armazenado em uma nova imagem g(x,y). O termo DOMÍNIO ESPACIAL refere-se ao próprio conjunto de pixels que compõem e imagem, ou seja, a própria f(x,y). Esse tipo de operação consiste na aplicação de uma máscara (matriz de pequena dimensão) como elemento estruturante da vizinhança de um dado pixel. As operações de arranjo matricial envolvidas são a CORRELAÇÃO e a CONVOLUÇÃO. A correlação consiste em mover a máscara pela imagem e calcular a soma dos produtos em cada posição. A convolução funciona da mesma forma, exceto que a mascara é rotacionada de 180°. Em termos matemáticos, a correlação de uma máscara M(x, y) de tamanho m x n com uma imagem f(x, y) é dada pela equação: a as b bt tysxftsMyxfyxMyxg ),(),(),(),(),( onde a = (m-1)/2 e b = (n-1)/2. Já a convolução é dada pela equação: a as b bt tysxftsMyxfyxMyxg ),(),(),(),(),( Como um primeiro exemplo, consideremos uma máscara 3 x 3 onde todos os elementos sejam iguais a 1/9 (0,1111...) Conforme a primeira equação acima (correlação de um arranjo matricial) podemos escrever: Ou seja: 1/9 1/9 1/9 1/9 1/9 1/9 1/9 1/9 1/9 17 Ora, isso nada mais é do que calcular a média dos 9 pixels (valor do pixels central f(x,y), e de seus oito vizinhos) e substituir na posição correspondente em g(x,y). Por essa razão, a máscara representada acima é denominada MASCARA DE MÉDIA. Repetindo a operação para todos os valores de f(x, y) obteremos uma nova imagem g(x,y) (Figura 1). Figura 1. Funcionamento da filtragem espacial linear utilizando uma máscara 3 x 3. A forma escolhida para expressar as coordenadas dos coeficientes da máscara simplifica a escrita de expressões para filtragem linear (GONZALEZ, R. C. e WOODS, R. E. “Processamento Digital de Imagens”, 3ª. Edição, São Paulo, Pearson, 2010, página 95.) Em forma de PSEUDOCÓDIGO as duas operações (correlação e convolução) podem ser descritas como: tipo f = matriz [0..numero_de_colunas-1, 0..numero_de_linhas-1] de inteiros; tipo gCr = matriz [0..numero_de_colunas-1,0..numero_de_linhas-1] de inteiros; tipo gCv = matriz [0..numero_de_colunas-1,0..numero_de_linhas-1] de inteiros; tipo M = matriz [0..2,0..2] de real; // Mascara 3 x 3 inteiro X, Y, S, T; 18 // Máscara de média 3 x 3 (cada elemento vale 1/9) para X de 0 até 2 passo 1 faça para Y de 0 até 2 passo 1 faça M[X,Y]=1/9; // Calcula CORRELAÇÃO e CONVOLUÇÃO excluindo as bordas para X de 1 até numero_de_colunas-2 passo 1 faça para Y de 1 até numero_de_linhas-2 passo 1 faça gCr[X,Y]=0; gCv[X,Y]=0; para S de -1 até 1 passo 1 faça para T de -1 até 1 passo 1 faça gCr[X,Y]= gCr[X,Y] + M[S+1,T+1]*f(X+S,Y+T); // Correlação gCv[X,Y]= gCv[X,Y] + M[S+1,T+1]*f(X-S,Y-T); // Convolução fimpara; fimpara; fimpara; fimpara; fim. O efeito visual que a MASCARA DE MÉDIA produz sobre a imagem corresponde a de SUAVIZAÇÃO (blurring) (a) (b) (c) Figura 2. Resultado da aplicação da máscara de média simples. Da esquerda para a direita: imagem original, imagem resultante da aplicação de uma máscara de média 3 x 3, imagem resultante da aplicação de uma máscara 5 x 5. Observe o efeito de borda, particularmente notável na última figura. ALGUNS FILTROS LINEARES 3 x 3 ÚTEIS: FILTROS DE SUAVIZAÇÃO OU PASSA-BAIXA: Filtro de Média 111 111 111 9 1 1z Filtro de Média ponderada (peso 2 no pixel central) 111 121 111 10 1 2z Filtro Gaussiano 121 242 121 16 1 3z 19 FILTROS DE AGUÇAMENTO, ÊNFASE OU PASSA-ALTA: Ao contrário dos filtros de média, que suavizam (borram) a imagem, os filtros de aguçamento servem para detecção ou realce de bordas. Filtros Gradiente ou Derivada de Imagens (Prewitt e Sobel) permitem a detecção de bordas. São aplicados em conjunto. Primeiro aplica-se um e depois o outro sobre a imagem original obtendo duas imagens distintas, com bordas realçadas, que são combinadas (somadas) posteriormente. Prewitt Horizontal (realça/destaca linhas horizontais) 111 000 111 HGP Prewitt Vertical (realça/destaca linhas verticais) 101 101 101 VGP Sobel Horizontal (realça/destaca linhas horizontais) 121 000 121 HGS Sobel Vertical (realça/destaca linhas verticais) 101 202 101 VGS Filtro Laplaciano (derivada segunda da imagem). No operador laplaciano o coeficiente central tem o sinal oposto dos demais. Laplaciano 010 141 010 1GL ou 010 141 010 2GL Laplaciano com termos diagonais 111 181 111 1GLD ou 111 181 111 2GLD Observe que, nas máscaras apresentadas logo acima, a SOMA DOS PESOS é nula. Outra diferença é que seu uso elas pode resultar em valores de pixels negativos ou acima do valor máximo. Nestes casos, é preciso normalizá-los ou simplesmente descartá-los (p.ex., se g(x,y) < 0 g(x,y) = 0). As figuras 3 e 4, a seguir, exemplificam alguns dos filtros (máscaras) de aguçamento apresentados e seus resultados. 20 (a) (b) (c) (d) Figura 3. Resultado da aplicação das máscaras (filtros espaciais) de PREWITT. (a) imagem original, (b) Prewitt Horizontal, (c) Prewit Vertical e (d) uma curiosa aplicação de (a) + (c) produzindo um efeito de alto/baixo relevo. (a) (b) (c) (d) Figura 4. Resultado da aplicação do LAPLACIANO. (a) imagem original, (b) Laplaciano com termos diagonais e peso central positivo - GLD1, (c) Laplaciano com termos diagonais e peso central negativo – GLD2 e (d) aplicação de (a) - (c) produzindo um certo efeito de aguçamento da imagem. Por fim, para ilustrar a complexidade que é a aplicação de máscaras, considere os seguintes passos, que irão resultar no que é conhecido como MASCARA DE NITIDEZ (unsharp masking) e MÁSCARA DE ALTO-REFORÇO (high-boost): 1. Borrar a imagem original, f(x,y), com a aplicação de uma máscara de média, obtendo g(x,y). 2. Subtrair a imagem borrada da imagem original, ou seja: g(x,y) = f(x,y) - g(x,y) para todos os pixels (x,y). A imagem resultante é denominada MÁSCARA. 3. Somar a MÁSCARA, multiplicada por uma constante k, à imagem original: g(x,y) = f(x,y) – k.g(x,y). No passo 3, quando k = 1 o resultado k.g(x,y) é a MÁSCARA DE NITIDEZ padrão. Quando k > 1 a máscara é denominada de ALTO-REFORÇO. Quando k < 1 o resultado será uma MÁSCARA DE NITIDEZ mais atenuada. A figura a seguir mostra o exemplo de aplicação de uma MÁSCAR DE NITIDEZ quando k = 1 e de ALTO-REFORÇO quando k = 2. (a) (b) (c) (d) Figura 5. Resultado da aplicaçãodas MÁSCARAS de (b) NITIDEZ (k = 1) e (b, c) ALTO-REFORÇO (com k = 2 e k = 5). (a) é a imagem original. Note que o resultado do ALTO-REFORÇO para k elevado é muito parecido com o aguçamento usando o LAPLACIANO. 21 FILTROS (MÁSCARAS) NÃO LINEARES OU DE ESTATÍSTICA DE ORDEM As máscaras acima são consideradas MÁSCARAS ou FILTROS LINEARES, pois as operações de CORRELAÇÃO e CONVOLUÇÃO são operações LINEARES. Já os FILTROS DE ESTATÍSTICA DE ORDEM, como se baseiam na CLASSIFICAÇÃO, ou ORDENAÇÃO, dos pixels contidos na área da imagem coberta pela máscara, e não mais pela média ou quaisquer outras operações de arranjo matricial. O mais conhecido filtro nesta categoria é o FILTRO DE MEDIANA (ou MÁSCARA DE MEDIANA). Apesar de também SUAVIZAR (ou BORRAR) a imagem, com no filtro de média, o filtro de MEDIANA é mais empregado na REMOÇÃO DE RUÍDOS ALEATÓRIOS que, porventura, ocorram na imagem original. Em particular, o filtro de mediana é bastante eficaz na remoção de um tipo de RUÍDO IMPULSIVO denominado SAL E PIMENTA (distribuição aleatória de pixels brancos, “sal” e pretos, “pimenta”). A MEDIANA consiste no “elemento do meio” de uma amostra ordenada. Sendo assim, a aplicação da máscara de mediana consiste em: 1. Ordenar os valores de f(x,y) e vizinhos contidos sob a cobertura da máscara centrada em (x,y). 2. Substituir o valor f(x,y) pelo valor obtido de MEDIANA. Por exemplo, se temos uma área de da imagem coberta pela máscara 3 x 3 com o valores: 0 2 5 4 9 2 3 6 3 O pixel central na imagem resultante (filtrada) será _ _ _ _ 3 _ _ _ _ Que é a MEDIANA da sequência ordenada: {0, 2, 2, 3, 3, 4, 5, 6, 9}, sendo os demais valores de sua vizinhança determinados pelos sucessivos deslocamentos da máscara sobre a imagem original. Na figura a seguir mostramos nossa imagem exemplo original “contaminada” com um RUÍDO IMPULSIVO tipo SAL E PIMENTA e depois filtrada com uma MÁSCARA DE MEDIANA. (a) (b) (c) Figura 5. Resultado da aplicação da MÁSCARA de MEDIANA. (a) Imagem original. (b) Imagem original contaminada com ruído SAL E PIMENTA. (c) Imagem filtrada com a MASCARA DE MEDIANA 3 x 3.
Compartilhar