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\).
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_LINEARr = 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\).
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
abtx
cdty
● Flecha naranja (punta triangular) + cuerpo rectangular negro. La transformación afín se aplica a toda la figura.