PDI+VC · Ejercicio de Programación

EP02_07 — 🔍 Redimensionamiento (Escala)

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 (nearest o bilinear).
  • 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\).
🔍 Simulador EP02_07: Redimensionamiento e Interpolación (sx = sy) Nearest vs Bilineal

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).

1.0
Factor = 1.0 → Tamaño Original (3×3)  |  Factor = 2.0 → 6×6  |  Factor = 4.0 → 12×12
Original (3×3)
🔲 Vecino Más Próximo
🌀 Interpolación Bilineal
Factor = 1.00 → tamaño 3×3 (sin cambio)
Figura 2.18: Simulador EP02_07: Redimensionamiento Espacial e Interpolación (Vecino más cercano vs Bilineal)
# Not yet ported to this language in this version — conceptual reference in Python.
%%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))
TestSuite("EP02_07.cpp").run()
✔️ EP02_07.cases ya existe en casos/
📋 5 caso(s) cargado(s) de casos/EP02_07.cases
💥 Archivo EP02_07.cpp no encontrado.