As transformações geométricas em imagens bidimensionais fazem um mapeamento entre as coordenadas da imagem original e as coordenadas da imagem transformada.
Iremos explicar as transformações geométricas com o auxílio de equações matemáticas, por ser uma representação mais precisa do que apenas explicar em linguagem natural. Entretanto, vamos procurar ser bastante consistentes entre as equações, nomes de variáveis usadas de modo que as equações que estamos colocando aqui sejam correspondências diretas nos programas Python/NumPy que estaremos exercitando.
As transformações geométricas são da forma a seguir. Temos a imagem de entrada f, com coordenadas (r,c) utilizando a notação do NumPy de (linha, coluna). O valor de f(r,c) deve ser mapeado para a nova imagem g na coordenada (r',c'):
$$ g(r',c') = f(r,c), \ \ (r,c) \in [0,H-1] \times [0,W-1] $$As coordenadas (r',c') são dadas pela transformação geométrica com 6 parâmetros
$$ \begin{matrix} r'= t_{r,r} r + t_{c,r} c + t_{r}\\ c'= t_{r,c} r + t_{c,c} c + t_{c}\\ \end{matrix} $$Utilizando a representação em coordenadas homogêneas, é possível colocar a equação acima na forma de multiplicação matricial.
$$ \begin{matrix} \left[\begin{array}{c} r' \\ c' \\ 1 \end{array}\right] &=& \left[\begin{array}{ccc} t_{r,r} & t_{c,r} & t_{r}\\ t_{r,c} & t_{c,c} & t_{c}\\ 0 & 0 & 1 \end{array} \right] \left[\begin{array}{c} r \\ c \\ 1 \end{array}\right] \end{matrix}$$A matriz T é denominada de matriz de transformação geométrica e possui 6 elementos não nulos:
$$ \begin{matrix} T &=& \left[\begin{array}{ccc} t_{r,r} & t_{c,r} & t_{r}\\ t_{r,c} & t_{c,c} & t_{c}\\ 0 & 0 & 1 \end{array} \right] \\ \end{matrix} $$Existem duas formas principais de se implementar a transformação geométrica: Mapeamento direto e mapeamento inverso.
No mapeamento direto, varre-se os pixels da imagem f e mapeia-os na imagem g:
$$ g(T(r,c)) = f((r,c)), \ \ (r,c) \in [0,H-1] \times [0,W-1] $$
A desvantagem neste caso, é que, dependendo da transformação, pode existir pixels de g que não são preenchidos.
No mapeamento inverso, varre-se os pixels da imagem g e busca-os na imagem f:
$$ g(r',c') = f(T^{-1}(r',c')),\ \ (r',c') \in [0,H'-1] \times [0,W'-1] $$Este é o método que usaremos nos nossos experimentos.
Utilizando coordenadas homogêneas vimos que a transformação geométrica de uma coordenada pode ser feita multiplicando-se a matriz $T$. Como fazer a transformação geométrica de $n$ coordenadas utilizando uma multiplicação matricial?
$$ \begin{matrix} \left[\begin{array}{c} r'_0 & r'_1 & \ldots & r'_{n-1} \\ c'_0 & r'_1 & \ldots & c'_{n-1}\\ 1 & 1 & \dots & 1 \end{array}\right] &=& \left[\begin{array}{ccc} t_{r,r} & t_{c,r} & t_{r}\\ t_{r,c} & t_{c,c} & t_{c}\\ 0 & 0 & 1 \end{array} \right] \left[\begin{array}{c} r_0 & r_1 & \ldots & r_{n-1}\\ c_0 & c_1 & \ldots & c_{n-1}\\ 1 & 1 & \ldots & 1 \end{array}\right] \end{matrix}$$Apesar da teoria de transformação geométrica mostrada acima ser simples, ela possui várias considerações práticas que tornam sua implementação bastante complexa.
As principais dificuldades práticas no processamento de transformações geométrica são:
In [ ]: