Enquanto as Transformações de intensidade alteram apenas o valor do pixel, sem depender de suas coordenadas, as transformações geométricas fazem um mapeamento de coordenadas, sem modificar o valor de cada pixel.
O exercício principal nesta atividade é desenvolvermos o programa que modificará a
implementação da transformação afim da toolbox ia898:affine
. Para isto, precisamos
primeiro rever a teoria de transformação geométrica 2D utilizando coordenadas homogêneas e
matriz de transformação.
Leia agora o problema que deverá ser entregue: activity_mariecp_3_gg Modificar iaffine
.
A modificação solicitada diz respeito aos pixels na imagem transformada que não
têm correspondência com a imagem de entrada. Na implementação atual da iaffine, estes valores
são buscados na imagem original, com o uso da função "clip" do NumPy. Altere este comportamento
de modo que estes valores fiquem zerados.
Apesar de parecer fácil, a solução exige um perfeito entendimento da
implementação da ia636:iaffine
. Utilizando o NumPy, busque uma solução que seja simples e eficiente.
A seguir será feita uma demonstração do funcionamento ia636:iaffine
com uma pequena
imagem numérica exemplificando seu passo a passo. A ideia é que você utilize este página como
rascunho da sua solução. Depois de ver o passo a passo, edite-o para obter o resultado
desejado. Uma vez conseguido, coloque sua função modificada no local apropriado para submissão
no sistema automático de entrega de programas do Adessowiki.
In [1]:
import numpy as np
t = np.array([2.1, 0.8])
T = np.array([[1,0,t[1]],
[0,1,t[0]],
[0,0,1]])
f = np.array([[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9,10],
[11,12,13,14,15]])
In [2]:
domain = f.shape
n = f.size
H,W = f.shape
print('domain:', domain)
In [3]:
r1,c1 = np.indices(domain)
print('r1=\n', r1)
print('c1=\n', c1)
In [4]:
rc1 = np.array([ r1.ravel(),
c1.ravel(),
np.ones(n)])
print('rc1=\n', rc1)
In [5]:
rc_float = np.linalg.inv(T).dot(rc1)
print('rc_float=\n',rc_float)
In [6]:
rr = np.rint(rc_float[0]).astype(int)
cc = np.rint(rc_float[1]).astype(int)
print('rr=\n', rr)
print('cc=\n', cc)
In [7]:
r = np.clip(rr,0,H-1).reshape(domain)
c = np.clip(cc,0,W-1).reshape(domain)
print('r=\n', r)
print('c=\n', c)
Uma vez que as coordenadas estão todas calculadas, é feita agora a cópia dos pixels da imagem f nas coordenadas calculadas para os pixels da imagem g. Veja que a indexação de f está sendo feita por dois arrays r e c que possuem as mesmas dimensões da imagem de entrada f. Esta é uma técnica do Numpy de indexação por arrays que é bastante poderosa e eficiente.
In [9]:
g = f[r,c]
print('g=\n', g)
In [ ]: