PDI+VC · Ejercicio de Programación

EP02_08 — 🔀 Cortante (Shear)

2.12.8 EP02_08 🔀 Cortante (Shear)

En esta actividad, debes implementar la transformación de cortante en una imagen. El cortante es una transformación afín que desplaza cada punto en una dirección fija, por un valor proporcional a su distancia de una recta paralela a esa dirección, resultando en un efecto de inclinación.

  • Lee dos enteros L y C, que representan las dimensiones de la matriz.
  • Lee dos valores reales \(sh_x\) (cortante horizontal) y \(sh_y\) (cortante vertical).
  • 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 de la imagen (recortando lo que exceda los límites).
  • Imprime la matriz resultante con las dimensiones \(L \times C\).
  • Ver en la Figura 2.19 una simulación de este EP.

📌 Importante:

  • Mapeo Inverso: Para cada píxel \((x', y')\) de la imagen de destino, calcula la posición correspondiente en el origen \((x, y)\) utilizando la matriz de cortante inversa.
  • Relleno: Las coordenadas que resulten en posiciones fuera de la matriz original deben rellenarse con 0.
  • Coordenadas: Para fines de esta implementación, considera \(x\) como el índice de la fila e \(y\) como el índice de la columna.

2.12.8.1 🧠 Distorsión Afín

El cortante altera la geometría de la imagen inclinando sus ejes. La relación entre las coordenadas originales \((x, y)\) y las transformadas \((x', y')\) está dada por:

\[\begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix} = \begin{bmatrix} 1 & sh_x & 0 \\ sh_y & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix}\]

Esto resulta en las ecuaciones:

  • \(x' = x + sh_x \cdot y\)
  • \(y' = y + sh_y \cdot x\)

2.12.8.2 📋 Tarea (especificación para VPL)

Entrada:

La primera línea contiene L.

La segunda línea contiene C.

La tercera línea contiene los factores shx y shy.

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 mismas dimensiones \(L \times C\).

2.12.8.3 📌 Ejemplos

Entrada Salida Observación
3
3
0.5 0.0
nearest
10 20 30
40 50 60
70 80 90
10 20 30
0 40 50
0 0 70
Cortante horizontal: fila \(i\) se desplaza \(\lfloor i \cdot 0.5 \rfloor\) píxeles. Fila \(0→0\)px, fila \(1→0\)px, fila \(2→1\)px. Los píxeles desplazados hacia fuera se descartan y las posiciones vacías se rellenan con \(0\).
2
2
0.0 1.0
nearest
10 20
30 40
10 0
30 20
Cortante vertical: columna \(j\) se desplaza \(\lfloor j \cdot 1.0 \rfloor\) píxeles hacia abajo. Columna \(0→0\)px (sin cambios), columna \(1→1\)px: \(20\) baja a \((1,1)\) y \((0,1)\) queda \(0\).
✂️ Simulador EP02_08: Cortante (Shear) 2D x' = x + shx·y | y' = y + shy·x

Ajusta los coeficientes de cortante horizontal (shx) y vertical (shy) para observar la deformación angular de la imagen mediante mapeo inverso de coordenadas.

0.00
0.00
Original (4×4)
Cortada (Vecino más cercano)
shx = 0.00, shy = 0.00 → sin deformación angular (imagen original)
Figura 2.19: Simulador EP02_08: Transformación Geométrica de Cortante 2D (Cizallamiento Horizontal y Vertical)
%%writefile EP02_08.py
# Código Python
Overwriting EP02_08.py
TestSuite("EP02_08.py").run()
✔️ EP02_08.cases ya existe en casos/
📋 5 caso(s) cargado(s) de casos/EP02_08.cases

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