Nesta atividade, você deve implementar uma transformação afim arbitrária em uma imagem. Esta operação é a generalização de todas as transformações lineares (escala, rotação, cisalhamento) combinadas com a translação, permitindo manipulações geométricas complexas através de uma única matriz.
Leia dois inteiros L e C, representando as dimensões da matriz.
Leia seis valores reais (\(a, b, t_x, c, d, t_y\)) que compõem a matriz de transformação afim \(2 \times 3\).
Leia uma string representando o método de interpolação (nearest ou bilinear).
Leia os valores inteiros da matriz original.
Aplique a transformação mantendo o tamanho original \(L \times C\).
Mapeamento Inverso: Para calcular o valor de cada pixel na imagem de destino, você deve utilizar a inversa da matriz de transformação afim fornecida para encontrar a coordenada correspondente na imagem original.
Preenchimento: Coordenadas calculadas que caiam fora dos limites \([0, L-1]\) e \([0, C-1]\) da imagem original devem resultar em um pixel de valor 0.
Flexibilidade: Esta implementação deve ser capaz de realizar qualquer uma das tarefas anteriores (translação, rotação, etc.) bastando alterar os parâmetros da matriz.
Dica:
flags = cv2.INTER_NEAREST if interp =='nearest'else\ cv2.INTER_CUBIC if interp =='bicubic'else\ cv2.INTER_LANCZOS4 if interp =='lanczos'else\ cv2.INTER_LINEARr = cv2.warpAffine(img, M, (C, L), flags=flags)
2.12.9.1 🧠 Combinação de Operações
A transformação afim preserva pontos, retas e planos. No processamento de imagens, ela mapeia a posição \((x, y)\) para \((x', y')\) seguindo o sistema:
\[\begin{bmatrix} x' \\ y' \end{bmatrix} = \begin{bmatrix} a & b \\ c & d \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix} + \begin{bmatrix} t_x \\ t_y \end{bmatrix}\]
Ou, de forma compacta em coordenadas homogêneas:
\[\begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix} = \begin{bmatrix} a & b & t_x \\ c & d & t_y \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix}\]
2.12.9.2 📋 Tarefa (especificação para VPL)
Entrada:
A primeira linha contém L.
A segunda linha contém C.
A terceira linha contém seis floats: a b tx c d ty.
A quarta linha contém o método interp (nearest ou bilinear).
As linhas seguintes contêm os elementos da matriz \(L \times C\).
Saída:
A matriz transformada com as dimensões originais \(L \times C\).
2.12.9.3 📌 Exemplos
Entrada
Saída
Observação
2
2
1.0 0.0 0.5 0.0 1.0 0.5
bilinear
10 20
30 40
15 20
25 30
Translação fracionária \((t_x=0.5, t_y=0.5)\): cada pixel de saída \((i,j)\) amostra a posição \((i+0.5,\, j+0.5)\) da entrada via bilinear. Ex: \((0,0)\) interpola os quatro vizinhos \(→15\).
Escala \(2\times\) via matriz afim \((a=2, d=2)\): cada pixel de saída \((i,j)\) amostra a posição \((2i, 2j)\) da entrada com nearest. Ex: \((0,2)→(0,4)\) fora da imagem \(→\) nearest clipa para \((0,2)=3\)… aguarda confirmação da lógica de borda.
📐 Simulador EP02_09: Transformação Afim 2D[x'] = [a b tx]·[x y 1]ᵀ
Ajuste os parâmetros da matriz afim 2×3 (rotação, escala, cisalhamento e translação) e observe o efeito aplicado sobre a figura de referência.
Matriz afim 2×3
abtx
cdty
● Seta laranja (ponta triangular) + corpo retangular preto. A transformação afim é aplicada à figura inteira.
Figura 2.20: Simulador EP02_09: Transformação Afim 2D (Matriz 2×3)
%%writefile EP02_09.py# Código Python
Overwriting EP02_09.py
TestSuite("EP02_09.py").run()
✔️ EP02_09.cases já existe em casos/
📋 5 caso(s) carregado(s) de casos/EP02_09.cases
🔍 Testando Python: EP02_09.py
⚠️ EP02_09.py: Arquivo sem conteúdo (menos de 3 linhas). Testes ignorados.