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

EP02_06 — 🔄 Rotação de Imagem

2.12.6 EP02_06 🔄 Rotação de Imagem

Nesta atividade, você deve implementar a rotação de uma imagem em torno do seu centro geométrico. Esta operação requer o mapeamento de coordenadas e o uso de técnicas de interpolação para determinar os novos valores dos pixels.

  • Leia dois inteiros L e C, representando as dimensões da matriz.
  • Leia um valor real \(\theta\) (ângulo em graus) e uma string representando o método de interpolação (nearest ou bilinear).
  • Leia os valores inteiros da matriz original.
  • Realize a rotação em torno do centro da imagem \((L/2, C/2)\).
  • Imprima a matriz resultante com as mesmas dimensões da original.
  • Ver na Figura 2.17 uma simulação deste EP.

📌 Importante:

  • Mapeamento Inverso: Para evitar “buracos” na imagem final, percorra cada pixel \((x', y')\) da imagem de destino e calcule sua posição correspondente \((x, y)\) na imagem original usando a matriz de rotação inversa.

  • Interpolação:

  • nearest: Atribui o valor do pixel mais próximo da coordenada calculada.

  • bilinear: Calcula uma média ponderada baseada nos 4 vizinhos mais próximos.

  • Bordas: Pixels cuja origem \((x, y)\) caia fora dos limites da imagem original devem ser preenchidos com 0.

2.12.6.1 🧠 Transformação por Ângulo

A rotação de um ponto \((x, y)\) em relação à origem por um ângulo \(\theta\) é dada pela matriz de transformação. Para rotacionar em torno de um centro \((x_c, y_c)\), primeiro transladamos o centro para a origem, rotacionamos e transladamos de volta:

\[\begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix} = \begin{bmatrix} \cos\theta & -\sin\theta & x_c \\ \sin\theta & \cos\theta & y_c \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x-x_c \\ y-y_c \\ 1 \end{bmatrix}\]

Dica: Use o mapeamento inverso para garantir que todos os pixels da imagem de saída sejam preenchidos corretamente.

2.12.6.2 📋 Tarefa (especificação para VPL)

Entrada:

A primeira linha contém L.

A segunda linha contém C.

A terceira linha contém o ângulo theta (em graus) e o método interp (nearest ou bilinear).

As linhas seguintes contêm os elementos da matriz \(L \times C\).

Saída:

A matriz rotacionada com L linhas e C colunas.

2.12.6.3 📌 Exemplos

Entrada Saída Observação
2
2
90 nearest
1 2
3 4
3 1
4 2
Rotação de 90° horário: a coluna 0 vira a linha 0 (de baixo para cima). \((0,0)=1→(1,0)\), \((1,0)=3→(0,0)\), \((0,1)=2→(1,1)\), \((1,1)=4→(0,1)\).
3
3
45 bilinear
0 0 0
0 255 0
0 0 0
0 180 0
180 255 180
0 180 0
Rotação de 45°: o pixel central permanece \(255\); os vizinhos diretos recebem valor interpolado \(\approx 180\) por bilinear; os cantos permanecem \(0\).
🔄 Simulador EP02_06: Rotação Geométrica 2D x' = x·cosθ − y·sinθ | y' = x·sinθ + y·cosθ

Ajuste o ângulo de rotação (θ) via slider ou atalhos rápidos para observar a transformação trigonométrica das coordenadas em torno do centro da imagem.

0°

● Quadrado verde com marcador laranja (canto superior direito) – rotação em torno do centro.

θ = 0° → cos = 1.000, sin = 0.000 → Matriz Identidade
Figura 2.17: Simulador EP02_06: Rotação de Imagem em Torno da Origem por Ângulo θ
%%writefile EP02_06.py
# Código Python
Overwriting EP02_06.py
TestSuite("EP02_06.py").run()
✔️ EP02_06.cases já existe em casos/
📋 5 caso(s) carregado(s) de casos/EP02_06.cases

🔍 Testando Python: EP02_06.py
⚠️ EP02_06.py: Arquivo sem conteúdo (menos de 3 linhas). Testes ignorados.