lionisEX04

Autor: lionis
Data: 02/04/2009
  1. Equação matemática do uso indexado imagens no Python.

Dadas as matrizes A, B, X e Y:

Nota-se que A, X e Y possuem as mesmas dimensões m e n. Assim, A, X e Y são definidos da seguinte forma:

Temos, portanto:

Internamente, o Python assume a seguinte indexação:

Assim, temos que:

  1. Estudar a função iaffine da toolbox IA636. Ver como funciona exercitando com valores interessantes. Entender como funciona a sua codificação.
 1 I = mmreadgray('lenina.pgm')
 2 theta = math.pi/6
 3 escala = array([[2,0,0],[0,0.5,0],[0,0,1]])
 4 rotacao = array([[cos(theta),-sin(theta),0],[sin(theta),cos(theta),0],[0,0,1]])
 5 translacao = array([[1,0,50],[0,1,-30],[0,0,1]])
 6 
 7 adshow(I, title = 'Imagem monocromática com 256 niveis de cinza')
 8 adshow(iaffine(I,escala), title = 'Escala: Sx=2, Sy=0.5')
 9 adshow(iaffine(I,rotacao), title = 'Rotação: theta=30 graus')
10 adshow(iaffine(I,translacao), title = 'Translação: x=50, y=-30. Não ocorre a translação pois a iaffine original não suporta esta operação.')

Imagem monocromática com 256 niveis de cinza

Escala: Sx=2, Sy=0.5

Rotação: theta=30 graus

Translação: x=50, y=-30. Não ocorre a translação pois a iaffine original não suporta esta operação.

  1. Fazer uma nova função, utilizando o mapeamento direto.
 1 def iaffine2(f, T):
 2     m,n = f.shape #captura as dimensões da imagem
 3     x,y = meshgrid(range(n),range(m)) #gera as meshgrids X e Y
 4     aux = concatenate((reshape(x, (1,m*n)), reshape(y, (1,m*n)))) #transforma X e Y em vetores unidimensionais e os concatena
 5     aux = concatenate((aux, ones((1, m*n)))) #concatena um vetor de 1, para que seja possível a multiplicação por T, e para que seja possível a translação
 6 
 7     aux1 = ceil(dot(T,aux)).astype(int) #multiplica T pela matriz de coordenadas, aproximando os dados calculados para inteiros
 8     x1,y1 = aux1[0,:].reshape(m,n), aux1[1,:].reshape(m,n) #novamente transforma X e Y em vetores unidimensionais
 9 
10     #elimina coordenadas inexistentes
11     x1 = maximum(0, minimum(n-1, x1))
12     y1 = maximum(0, minimum(m-1, y1))
13 
14     I = zeros((m,n)) #cria a imagem destino
15     I[y1,x1] = f #a imagem destino recebe os pixels diretamente da imagem original, de acordo com as matrizes de coordenadas Y1 e X1
16 
17     return I
18 
19 adshow(I, title = 'Imagem monocromática com 256 niveis de cinza')
20 adshow(iaffine2(I,escala), title = 'Escala: Sx=2, Sy=0.5')
21 adshow(iaffine2(I,rotacao), title = 'Rotação: theta=30 graus')
22 adshow(iaffine2(I,translacao), title = 'Translação: x=50, y=-30')

Imagem monocromática com 256 niveis de cinza

Escala: Sx=2, Sy=0.5

Rotação: theta=30 graus

Translação: x=50, y=-30

O mapeamento direto gera "buracos" na imagem, pois varre todos os pixels da imagem original e os desloca para outras posições - coincidentes ou fora - na imagem resultante.

  1. Opcionalmente, melhorar a função iaffine.

A função iaffine2 foi aprimorada, no sentido de suportar translações. Para tal, foi utilizado o recurso das coordenadas homogêneas, com w=1.

  1. Representação matricial da interpolação bicúbica (exercício proposto pelo Prof. Clésio)