Ajusta los coeficientes de cortante horizontal (shx) y vertical (shy) para observar la deformación angular de la imagen mediante mapeo inverso de coordenadas.
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 (
nearestobilinear). - 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\). |
%%writefile EP02_08.py
# Código PythonOverwriting 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.