PDI+VC · Ejercicio de Programación

EP05_03 — 🟠 Cuantización DCT: la Verdadera Fuente de Compresión

5.13.3 EP05_03 🟠 Cuantización DCT: la Verdadera Fuente de Compresión

Una aplicación de galería de fotos necesita reducir el tamaño de miles de imágenes antes de hacer upload a la nube, sin recodificar todo desde cero. El ingeniero responsable ya tiene los coeficientes DCT de cada bloque \(4\times4\) calculados (la etapa costosa computacionalmente ya se ha realizado) — solo falta aplicar la tabla de cuantización, la etapa que realmente descarta información y genera compresión. Los coeficientes de alta frecuencia, menos perceptibles al ojo humano, reciben divisores grandes y tienden a convertirse en cero; los coeficientes de baja frecuencia, más perceptibles, reciben divisores pequeños y sobreviven casi intactos.

Vas a implementar exactamente esta etapa: cuantizar y descuantizar (dividir, redondear, multiplicar de vuelta) — el corazón de la compresión lossy del JPEG.

5.13.3.1 📋 Directrices de Implementación

  1. Dimensión del bloque: Leer el entero \(N\) (bloque \(N \times N\)).
  2. Coeficientes: Leer la matriz \(C\) de coeficientes DCT, \(N\) filas con \(N\) enteros cada una (pueden ser negativos).
  3. Tabla de cuantización: Leer la matriz \(Q\), \(N\) filas con \(N\) enteros positivos cada una.
  4. Cuantización: Para cada posición \((u,v)\), calcular el índice cuantizado \[ \tilde{C}(u,v) = \text{round}\!\left(\frac{C(u,v)}{Q(u,v)}\right) \] usando redondeo estándar al entero más cercano (los valores intermedios .5 nunca ocurren en los casos de prueba).
  5. Descuantización (reconstrucción): Calcular \[ C'(u,v) = \tilde{C}(u,v) \times Q(u,v) \]
  6. Salida: Mostrar la matriz reconstruida \(C'\), \(N \times N\), enteros.

5.13.3.2 📌 Restricciones Computacionales

  • Round-trip completo: la salida es el coeficiente reconstruido (\(\tilde{C} \times Q\)), no el índice cuantizado aislado.
  • División en punto flotante: la división \(C(u,v)/Q(u,v)\) debe realizarse en punto flotante antes del redondeo — la división entera truncada producirá un resultado incorrecto.
  • Signo preservado: los coeficientes negativos mantienen el signo después de la cuantización y la reconstrucción.
  • \(Q(u,v) > 0\) siempre: no hay necesidad de tratar la división por cero.

5.13.3.3 🧠 Fundamentación Teórica

Coeficiente Frecuencia Valor típico de \(Q\) Efecto de la cuantización
\(C(0,0)\) DC (promedio del bloque) Pequeño Casi siempre sobrevive — domina la energía
\(C(u,v)\) bajo \(u+v\) Baja frecuencia Pequeño/medio Parcialmente preservado
\(C(u,v)\) alto \(u+v\) Alta frecuencia Grande Frecuentemente se convierte en cero — fuente de la compresión

5.13.3.4 📦 Especificación de Entrada y Salida (VPL)

Entrada:

  • Línea 1: Entero \(N\).
  • \(N\) líneas siguientes: matriz \(C\) (coeficientes DCT, enteros, pueden ser negativos).
  • \(N\) líneas siguientes: matriz \(Q\) (tabla de cuantización, enteros positivos).

Salida:

  • Matriz reconstruida \(C'\), \(N \times N\), enteros separados por espacio.

5.13.3.5 📌 Ejemplos

Entrada Salida Observación
4
50 10 -5 0
8 -3 2 1
0 1 0 0
2 0 0 -1
2 5 7 8
4 7 8 11
6 8 11 12
9 11 12 14
50 10 -7 0
8 0 0 0
0 0 0 0
0 0 0 0
\(C(0,0)=50/2=25 \to 25\times2=50\) (preservado). \(C(0,2)=-5/7\approx-0.71\to-1\to-1\times7=-7\). Ya \(C(1,1)=-3/7\approx-0.43\to0\): anulado por la cuantización — la mayor parte del bloque se convierte en cero, ilustrando la compactación de energía en la esquina superior izquierda.
🎮 Simulador EP05_03: Cuantización DCT round(C / Q) × Q
Ajuste la escala de Q y vea cuántos coeficientes sobreviven (no cero) tras el round-trip.
Coeficientes DCT (C)
Reconstruido (round(C / Q) · Q)
–
Figura 5.34: Simulador EP05_03: Cuantización DCT (round-trip)
%%writefile EP05_03.cpp
// your solution
Overwriting EP05_03.cpp
TestSuite("EP05_03.cpp").run()
✔️ EP05_03.cases ya existe en casos/
📋 5 caso(s) cargado(s) de casos/EP05_03.cases

🔍 Probando C++: EP05_03.cpp
⚠️ EP05_03.cpp: archivo vacío (menos de 3 líneas). Pruebas omitidas.