Exercício 4

Autor: Rodrigo Mologni Gonçalves dos Santos
Data: 01/04/2009

Questão 1

Dadas as matrizes A e B de mesma ordem m linhas e n colunas, deseja-se, por meio dos vetores X e Y, percorrer todos os elementos contidos na matriz B e adicioná-los na matriz A, tal como representado pela expressão:

Para isto será necessário um vetor X de ordem m linhas, cujos elementos correpondem aos valores dos índices das linhas.

E um vetor Y de ordem n colunas, cujos elementos correspondem aos valores dos índices das colunas.

Assim a matriz B pode ser expressa, utilizando os vetores X e Y, da seguinte maneira:

Pode-se concluir, portanto, que a matriz A de ordem m linhas e n colunas, corresponde a uma matriz B de mesma ordem, cujos vetores de índices X e Y podem ser utilizados para percorrer todos os elementos da matriz B, tal como representado pela expressão:

Questão 2

A Figura 1 apresenta exemplos de transformações afins geradas pela função iaffine da toolbox ia636.

(a) Imagem original.

(b) Rotação de 15 graus em torno da origem.

(c) Escala com fator de multiplicação 2 no eixo x e 0.5 no eixo y.

(d) Cisalhamento com variação de 0.5 no eixo x e 0.25 no eixo y.

Exemplos de transformações afins geradas pela função iaffine da toolbox ia636.

Abaixo é apresentado uma breve descrição do funcionamento da função iaffine, destacando os procedimentos realizados em cada linha do código-fonte.

 1 # Os parâmetros de entrada 'f' e 'T' correspondem, respectivamente, a imagem e a transformação
 2 # que será aplicada à imagem.
 3 def iaffine(f, T):
 4 
 5     # Os parâmetros de entrada 'f' e 'T' são convertidos para matrizes.
 6     f, T = asarray(f), asarray(T)
 7 
 8     # A variável 'faux' recebe um vetor contendo todos os elementos da matriz 'f'.
 9     faux = ravel(f)
10 
11     # Caso a matriz 'f' seja unidimendional, ou seja, um vetor, então 'f' recebe um
12     # pseudo-índice para que seja tratada como uma matriz.
13     if len(f.shape) == 1:
14         f = f[NewAxis,:]
15 
16     # As variáveis 'm' e 'n' recebem, respectivamente, o número de linhas e colunas da
17     # matriz 'f'.
18     (m, n) = f.shape
19 
20     # As variáveis 'x' e 'y' recebem, respectivamente, matrizes de índices com o número de
21     # linhas e colunas iguais aos da matriz 'f'.
22     (x, y) = iameshgrid(range(n), range(m))
23 
24     # A variável 'aux' recebe a concatenação de dois vetores contendo, respectivamente, os
25     # elementos da matriz 'x' e 'y'.
26     aux = concatenate((reshape(x, (1, m * n)), reshape(y, (1, m * n))))
27 
28     # A variável 'aux' recebe a concatenação da matriz 'aux' com um vetor de elementos iguais
29     # a zero.
30     aux = concatenate((aux, zeros((1, m * n))))
31 
32     # A variável 'XY' recebe a multiplicação escalar da matriz inversa de 'T' com a 'aux'.
33     XY = matrixmultiply(inverse(T), aux)
34 
35     # As variáveis 'X' e 'Y' recebem, respectivamente, os elementos contidos na primeira e
36     # na segunda linha da matriz 'XY'.
37     X, Y = XY[0,:], XY[1,:]
38 
39     # A variável 'X' recebe o resultado do seguinte procedimento: primeiro, substitui todos
40     # os elementos do vetor 'X', cujo valor seja superior a (n - 1) e, segundo, substitui
41     # todos os elementos do vetor 'X', cujo valor seja inferior a 0.
42     X = maximum(0, minimum(n - 1, X))
43 
44     # A variável 'Y' recebe o resultado do seguinte procedimento: primeiro, substitui todos
45     # os elementos do vetor 'Y', cujo valor seja superior a (m - 1) e, segundo, substitui
46     # todos os elementos do vetor 'Y', cujo valor seja inferior a 0.
47     Y = maximum(0, minimum(m - 1, Y))
48 
49     # A variável 'XYi' recebe um vetor cujos valores correspondem a expressão
50     # (yij x h + xij), sendo 'xij' os elementos da matriz 'Y' e 'yij' os elementos da
51     # matriz 'X'.
52     XYi = iasub2ind(f.shape, map(round, Y), map(round, X))
53 
54     # A variável 'g' recebe uma matriz cujo elementos do vetor 'faux' são posicionados de
55     # acordo com a sequencia passada pelos valores do vetor 'XYi'.
56     g = take(faux, XYi)
57 
58     # O vetor 'g' é redimensionado como matriz de ordem 'm' linhas e 'n' colunas.
59     g = reshape(g, f.shape)
60 
61     # Retorna uma matriz 'g' que corresponde a transformação 'T' aplicada sobre a matriz 'f'.
62     return g

Questão 3

A Figura 2, ilustra exemplos de transformações afins geradas de maneira direta pela função direct, apresentada logo abaixo. O algoritmo implementado foi baseado em WATANABE.

 1 def direct(f, T):
 2     # Os parâmetros de entrada 'f' e 'T' são convertidos para matrizes.
 3     f, T = asarray(f), asarray(T)
 4 
 5     # As variáveis 'm' e 'n' recebem, respectivamente, o número de linhas e colunas da
 6     # matriz 'f'.
 7     m, n = f.shape
 8 
 9     # As variáveis 'i' e 'j' recebem, respectivamente, matrizes de índices com o número de
10     # linhas e colunas iguais aos da matriz 'f'.
11     i, j = mgrid[:m, :n]
12 
13     # A variável 'v' recebe a concatenação de dois vetores contendo, respectivamente, os
14     # elementos da matriz 'i' e 'j'.
15     v = concatenate((reshape(i, (1, m * n)), reshape(j, (1, m * n))))
16 
17     # A variável 'v' recebe a concatenação da matriz 'v' com um vetor de elementos iguais
18     # a um.
19     v = concatenate((v, ones([1, m * n])))
20 
21     # A variável 'XY' recebe a multiplicação matricial da matriz 'T' com a 'v'.
22     v = ceil(dot(T, v)).astype(int)
23 
24     # As variáveis 'x' e 'y' recebem, respectivamente, os elementos contidos na primeira e
25     # na segunda linha da matriz 'v'.
26     x, y = v[0,:], v[1,:]
27 
28     # A variável 'x' recebe o resultado do seguinte procedimento: primeiro, substitui todos
29     # os elementos do vetor 'x', cujo valor seja superior a (n - 1) e, segundo, substitui
30     # todos os elementos do vetor 'x', cujo valor seja inferior a 0.
31     x = maximum(0, minimum(n - 1, x))
32 
33     # A variável 'y' recebe o resultado do seguinte procedimento: primeiro, substitui todos
34     # os elementos do vetor 'y', cujo valor seja superior a (m - 1) e, segundo, substitui
35     # todos os elementos do vetor 'y', cujo valor seja inferior a 0.
36     y = maximum(0, minimum(m - 1, y))
37 
38     # Os vetores 'x' e 'y' são redimensionados como matrizes de ordem 'm' linhas e 'n' colunas.
39     x, y = x.reshape(m, n), y.reshape(m, n)
40 
41     # A variável 'g' recebe uma matriz de ordem 'm' linhas e 'n' colunas com elementos iguais
42     # a zero.
43     g = zeros([m, n])
44 
45     # A matriz 'g' recebe os elementos da matriz 'f', segundo os valores dos índices da
46     # matriz 'x' e 'y'.
47     g[x, y] = f
48 
49     # Retorna uma matriz 'g' que corresponde a transformação direta 'T' aplicada sobre a
50     # matriz 'f'.
51     return g
52 
53 adshow(image,
54     title = '(a) Imagem original.')
55 adshow(rotate(image, pi / 12, direct),
56     title = '(b) Rotação de 15 graus em torno da origem.')
57 adshow(scale(image, 2, 0.5, direct),
58     title = '(c) Escala com fator de multiplicação 2 no eixo x e 0.5 no eixo y.')
59 adshow(shear(image, 0.5, 0.25, direct),
60     title = '(d) Cisalhamento com variação de 0.5 no eixo x e 0.25 no eixo y.')

(a) Imagem original.

(b) Rotação de 15 graus em torno da origem.

(c) Escala com fator de multiplicação 2 no eixo x e 0.5 no eixo y.

(d) Cisalhamento com variação de 0.5 no eixo x e 0.25 no eixo y.

Figura 2 - Exemplos de transformações afins geradas de maneira direta.

Referências

WATANABE, Lionis de Souza Watanabe. Exercício 4. Disponível em http://parati.dca.fee.unicamp.br/adesso/wiki/ia636-2009/lionisEX04/view/. Acessado em 03/04/2009.