PDI+VC · Exercício de Programação

EP02_09 — 🧩 Transformação Afim Genérica

2.12.9 EP02_09 🧩 Transformação Afim Genérica

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\).
  • Imprima a matriz resultante.
  • Ver na Figura 2.20 uma simulação deste EP.

📌 Importante:

  • 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_LINEAR

r = 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\).
3
3
2.0 0.0 0.0 0.0 2.0 0.0
nearest
1 2 3
4 5 6
7 8 9
1 1 2
1 1 2
4 4 5
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
a b tx
c d ty

● Seta laranja (ponta triangular) + corpo retangular preto. A transformação afim é aplicada à figura inteira.

Matriz = [[1.0, 0.0, 0], [0.0, 1.0, 0]] → transformação identidade.
Figura 2.20: Simulador EP02_09: Transformação Afim 2D (Matriz 2×3)
%%writefile EP02_09.cpp
// sua solução
Overwriting EP02_09.cpp
TestSuite("EP02_09.cpp").run()
✔️ EP02_09.cases já existe em casos/
📋 5 caso(s) carregado(s) de casos/EP02_09.cases

🔍 Testando C++: EP02_09.cpp
⚠️ EP02_09.cpp: Arquivo sem conteúdo (menos de 3 linhas). Testes ignorados.