PDI+VC · Ejercicio de Programación

EP02_09 — 🧩 Transformación Afín Genérica

2.12.9 EP02_09 🧩 Transformación Afín Genérica

En esta actividad, debes implementar una transformación afín arbitraria sobre una imagen. Esta operación es la generalización de todas las transformaciones lineales (escala, rotación, cizallamiento) combinadas con la traslación, permitiendo manipulaciones geométricas complejas mediante una única matriz.

  • Lee dos enteros L y C, que representan las dimensiones de la matriz.
  • Lee seis valores reales (\(a, b, t_x, c, d, t_y\)) que componen la matriz de transformación afín \(2 \times 3\).
  • Lee una cadena que representa el método de interpolación (nearest o bilinear).
  • Lee los valores enteros de la matriz original.
  • Aplica la transformación manteniendo el tamaño original \(L \times C\).
  • Imprime la matriz resultante.
  • Ver en Figura 2.20 una simulación de este EP.

📌 Importante:

  • Mapeo Inverso: Para calcular el valor de cada píxel en la imagen de destino, debes utilizar la inversa de la matriz de transformación afín proporcionada para encontrar la coordenada correspondiente en la imagen original.
  • Relleno: Las coordenadas calculadas que caigan fuera de los límites \([0, L-1]\) y \([0, C-1]\) de la imagen original deben resultar en un píxel de valor 0.
  • Flexibilidad: Esta implementación debe ser capaz de realizar cualquiera de las tareas anteriores (traslación, rotación, etc.) bastando con alterar los parámetros de la matriz.

Consejo:

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 🧠 Combinación de Operaciones

La transformación afín preserva puntos, rectas y planos. En el procesamiento de imágenes, mapea la posición \((x, y)\) a \((x', y')\) siguiendo el 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}\]

O, de forma compacta en 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 📋 Tarea (especificación para VPL)

Entrada:

La primera línea contiene L.

La segunda línea contiene C.

La tercera línea contiene seis flotantes: a b tx c d ty.

La cuarta línea contiene el método interp (nearest o bilinear).

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

Salida:

La matriz transformada con las dimensiones originales \(L \times C\).

2.12.9.3 📌 Ejemplos

Entrada Salida Observación
2
2
1.0 0.0 0.5 0.0 1.0 0.5
bilinear
10 20
30 40
15 20
25 30
Traslación fraccionaria \((t_x=0.5, t_y=0.5)\): cada píxel de salida \((i,j)\) muestrea la posición \((i+0.5,\, j+0.5)\) de la entrada mediante bilinear. Ej: \((0,0)\) interpola los cuatro vecinos \(→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\) mediante matriz afín \((a=2, d=2)\): cada píxel de salida \((i,j)\) muestrea la posición \((2i, 2j)\) de la entrada con nearest. Ej: \((0,2)→(0,4)\) fuera de la imagen \(→\) nearest recorta a \((0,2)=3\)… espera confirmación de la lógica de borde.
📐 Simulador EP02_09: Transformación Afín 2D [x'] = [a b tx]·[x y 1]ᵀ

Ajusta los parámetros de la matriz afín 2×3 (rotación, escala, cizallamiento y traslación) y observa el efecto aplicado sobre la figura de referencia.

Matriz afín 2×3
a b tx
c d ty

● Flecha naranja (punta triangular) + cuerpo rectangular negro. La transformación afín se aplica a toda la figura.

Matriz = [[1.0, 0.0, 0], [0.0, 1.0, 0]] → transformación identidad.
Figura 2.20: Simulador EP02_09: Transformación Afín 2D (Matriz 2×3)
%%writefile EP02_09.py
# Código Python
Overwriting EP02_09.py
TestSuite("EP02_09.py").run()
✔️ EP02_09.cases ya existe en casos/
📋 5 caso(s) cargado(s) de casos/EP02_09.cases

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