PDI+VC · Ejercicio de Programación

EP02_06 — 🔄 Rotación de Imagen

2.12.6 EP02_06 🔄 Rotación de Imagen

En esta actividad, debes implementar la rotación de una imagen alrededor de su centro geométrico. Esta operación requiere el mapeo de coordenadas y el uso de técnicas de interpolación para determinar los nuevos valores de los píxeles.

  • Lea dos enteros L y C, que representan las dimensiones de la matriz.
  • Lea un valor real \(\theta\) (ángulo en grados) y una cadena que representa el método de interpolación (nearest o bilinear).
  • Lea los valores enteros de la matriz original.
  • Realice la rotación alrededor del centro de la imagen \((L/2, C/2)\).
  • Imprima la matriz resultante con las mismas dimensiones que la original.
  • Ver en Figura 2.17 una simulación de este EP.

📌 Importante:

  • Mapeo Inverso: Para evitar “huecos” en la imagen final, recorra cada píxel \((x', y')\) de la imagen de destino y calcule su posición correspondiente \((x, y)\) en la imagen original usando la matriz de rotación inversa.

  • Interpolación:

  • nearest: Asigna el valor del píxel más cercano a la coordenada calculada.

  • bilinear: Calcula un promedio ponderado basado en los 4 vecinos más cercanos.

  • Bordes: Los píxeles cuyo origen \((x, y)\) caiga fuera de los límites de la imagen original deben rellenarse con 0.

2.12.6.1 🧠 Transformación por Ángulo

La rotación de un punto \((x, y)\) con respecto al origen por un ángulo \(\theta\) se da mediante la matriz de transformación. Para rotar alrededor de un centro \((x_c, y_c)\), primero trasladamos el centro al origen, rotamos y trasladamos de vuelta:

\[\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}\]

Consejo: Use el mapeo inverso para garantizar que todos los píxeles de la imagen de salida se rellenen correctamente.

2.12.6.2 📋 Tarea (especificación para VPL)

Entrada:

La primera línea contiene L.

La segunda línea contiene C.

La tercera línea contiene el ángulo theta (en grados) y el método interp (nearest o bilinear).

Las líneas siguientes contienen los elementos de la matriz \(L \times C\).

Salida:

La matriz rotada con L filas y C columnas.

2.12.6.3 📌 Ejemplos

Entrada Salida Observación
2
2
90 nearest
1 2
3 4
3 1
4 2
Rotación de 90° horaria: la columna 0 se convierte en la fila 0 (de abajo hacia arriba). \((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
Rotación de 45°: el píxel central permanece \(255\); los vecinos directos reciben un valor interpolado \(\approx 180\) por bilinear; las esquinas permanecen \(0\).
🔄 Simulador EP02_06: Rotación Geométrica 2D x' = x·cosθ − y·sinθ | y' = x·sinθ + y·cosθ

Ajusta el ángulo de rotación (θ) con el slider o accesos rápidos para observar la transformación trigonométrica de las coordenadas alrededor del centro de la imagen.

0°

● Cuadrado verde con marcador naranja (esquina superior derecha) – rotación alrededor del centro.

θ = 0° → cos = 1.000, sin = 0.000 → Matriz Identidad
Figura 2.17: Simulador EP02_06: Rotación de Imagen en Torno al Origen por Ángulo θ
%%writefile EP02_06.py
# Código Python
Overwriting EP02_06.py
TestSuite("EP02_06.py").run()
✔️ EP02_06.cases ya existe en casos/
📋 5 caso(s) cargado(s) de casos/EP02_06.cases

🔍 Probando Python: EP02_06.py
⚠️ EP02_06.py: archivo vacío (menos de 3 líneas). Pruebas omitidas.