Ajuste el factor de escala (s) para comparar la interpolación por vecino más próximo (réplica discreta) con la interpolación bilineal (media ponderada de los 4 vecinos).
2.12.7 EP02_07 🔍 Redimensionamiento (Escala)
En esta actividad, debes implementar el redimensionamiento de una imagen utilizando factores de escala. A diferencia del submuestreo simple, aquí utilizaremos técnicas de interpolación para permitir tanto la ampliación como la reducción de la imagen.
- Lee dos enteros L y C, que representan las dimensiones de la matriz original.
- Lee dos valores reales \(s_x\) (escala en las filas) y \(s_y\) (escala en las columnas).
- Lee una cadena que representa el método de interpolación (
nearestobilinear). - Lee los valores enteros de la matriz original.
- Calcula las nuevas dimensiones: \(L' = \text{round}(L \times s_x)\) y \(C' = \text{round}(C \times s_y)\).
- Imprime la matriz resultante con las nuevas dimensiones.
- Ver en Figura 2.18 una simulación de este EP.
📌 Importante:
Mapeo inverso: Para cada píxel \((x', y')\) de la imagen de destino, encuentra la posición correspondiente en el origen usando \((x, y) = (x'/s_x, y'/s_y)\).
Interpolación:
nearest: Selecciona el valor del píxel más cercano (redondeo de las coordenadas).bilinear: Realiza una interpolación lineal doble entre los cuatro píxeles vecinos más cercanos en la imagen original.Bordes: Asegúrate de que el mapeo no intente acceder a índices fuera del intervalo \([0, L-1]\) y \([0, C-1]\).
2.12.7.1 🧠 Interpolación para Ampliación/Reducción
Redimensionar una imagen por factores \((s_x, s_y)\) exige el relleno de vacíos (en la ampliación) o la fusión de información (en la reducción). El método de interpolación define la calidad visual del resultado:
| Método | Funcionamiento | Efecto Visual |
|---|---|---|
| Nearest | Toma el valor del vecino más cercano. | Rápido, pero genera efecto “pixelado” o bloques. |
| Bilineal | Promedio ponderado de los 4 vecinos (\(2 \times 2\)). | Suaviza la imagen, reduciendo el aliasing. |
2.12.7.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 sx y sy.
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 redimensionada con dimensiones \(L' \times C'\).
2.12.7.3 📌 Ejemplos
| Entrada | Salida | Observación |
|---|---|---|
| 2 2 2.0 2.0 nearest 1 2 3 4 |
1 1 2 2 1 1 2 2 3 3 4 4 3 3 4 4 |
Ampliación 2×: cada píxel original se replica en un bloque 2×2. La imagen \(2\times2\) se convierte en \(4\times4\). |
| 2 2 0.5 0.5 nearest 10 20 30 40 |
10 | Reducción 0.5×: la imagen \(2\times2\) se convierte en \(1\times1\). Con nearest, el único píxel de salida muestrea la posición \((0,0)=10\). |
%%writefile EP02_07.py
# Código Python
import numpy as np
from morph import mm
# 1. Lectura de las dimensiones, factores y método
l = int(input())
c = int(input())
sx, sy = map(float, input().split())
interp = input().strip()
# 2. Lectura de la imagen original
img = mm.readImg(l, c)
# 3. Nuevas dimensiones
l_new = round(l * sx)
c_new = round(c * sy)
# 4. Redimensionamiento usando mm.resize
# cv2.resize usa (ancho, alto) = (columnas, filas)
resultado = mm.resize(img, (c_new, l_new), method=interp)
# 5. Visualización
print(mm.drawImg(resultado))Overwriting EP02_07.py
TestSuite("EP02_07.py").run()✔️ EP02_07.cases ya existe en casos/ 📋 5 caso(s) cargado(s) de casos/EP02_07.cases 🔍 Probando Python: EP02_07.py ✔️ Caso1_Ampliacao_2x_Nearest: OK ✔️ Caso2_Reducao_05x_Nearest: OK ✔️ Caso3_Sem_Escala: OK ✔️ Caso4_Ampliacao_Bilinear: OK ✔️ Caso5_Escala_Assimetrica: OK 📊 Resultado: 5/5 (100.0%) 🎉 ¡Felicidades! Todas las pruebas pasaron.