PDI+VC · Ejercicio de Programación

EP05_05 — 🏆 Pipeline JPEG Completo: DCT, Cuantización y Reconstrucción

5.13.5 EP05_05 🏆 Pipeline JPEG Completo: DCT, Cuantización y Reconstrucción

Usted ha sido contratado para crear, desde cero, un códec JPEG didáctico en un entorno embebido, sin ninguna biblioteca de imágenes disponible — solo operaciones matemáticas básicas. El cliente quiere entender exactamente dónde se pierde la calidad y dónde se recupera, bloque por bloque. Este es el desafío final del capítulo: integrar todo lo estudiado — la DCT-II ortonormal, la cuantización perceptual y la reconstrucción vía IDCT — en un único pipeline de extremo a extremo, procesando un bloque \(N \times N\) desde el inicio hasta el final, exactamente como el estándar JPEG lo hace internamente, \(8\times8\) píxeles a la vez.

5.13.5.1 📋 Directrices de Implementación

  1. Dimensión del bloque: Leer el entero \(N\).
  2. Bloque original: Leer la matriz de píxeles \(f(x,y)\), \(N\) líneas con \(N\) enteros en \([0,255]\).
  3. Tabla de cuantización: Leer la matriz \(Q\), \(N \times N\) enteros positivos.
  4. Centralización: Restar 128 de cada píxel: \(g(x,y) = f(x,y) - 128\).
  5. DCT-II 2D ortonormal: Calcular \[ C(u,v) = \alpha(u)\,\alpha(v)\sum_{x=0}^{N-1}\sum_{y=0}^{N-1} g(x,y)\,\cos\!\left[\frac{\pi(2x+1)u}{2N}\right]\cos\!\left[\frac{\pi(2y+1)v}{2N}\right] \] con \(\alpha(0)=\sqrt{1/N}\) y \(\alpha(k)=\sqrt{2/N}\) para \(k>0\).
  6. Cuantización: \(\tilde{C}(u,v) = \text{round}(C(u,v)/Q(u,v))\).
  7. Descuantización: \(C'(u,v) = \tilde{C}(u,v)\times Q(u,v)\).
  8. IDCT-II 2D (inversa ortonormal): Calcular \(g'(x,y)\) a partir de \(C'(u,v)\) usando la transformada inversa correspondiente (misma base, sumatorio sobre \(u,v\)).
  9. Reversión de la centralización y redondeo: \(f'(x,y) = \text{round}(g'(x,y) + 128)\), restringido al intervalo \([0,255]\) (clipping).
  10. Salida: Mostrar el bloque reconstruido \(f'\), \(N \times N\), enteros.

5.13.5.2 📌 Restricciones Computacionales

  • Pipeline completo obligatorio: todas las seis etapas (centralizar, DCT, cuantizar, descuantizar, IDCT, revertir) deben implementarse — omitir la cuantización no pasa las pruebas, pues el resultado sería idéntico al original.
  • Clipping: los valores reconstruidos fuera de \([0,255]\) deben truncarse (0 si es negativo, 255 si es mayor que 255).
  • Redondeo: tanto en la cuantización como en la reconstrucción final de los píxeles, use redondeo estándar; los casos de prueba evitan ambigüedad .5.
  • Base ortonormal: la normalización \(\alpha(u)\) y \(\alpha(v)\) debe aplicarse exactamente como se especifica — sin ella, la IDCT no reconstruye correctamente.

5.13.5.3 🧠 Fundamentación Teórica

Etapa Análoga en el estándar JPEG real Dónde se pierde la calidad
Centralización Misma — la DCT asume señal centrada en cero Sin pérdida
DCT-II Etapas 3–4 del pipeline (Tabla 5.7) Sin pérdida (transformación exacta y reversible)
Cuantización Etapa 5 — división por \(Q(u,v)\) Principal fuente de pérdida — los coeficientes de alta frecuencia se vuelven cero
IDCT Reconstrucción final Reconstruye exactamente los coeficientes cuantizados, no los originales

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

Entrada:

  • Línea 1: Entero \(N\).
  • \(N\) líneas siguientes: bloque original \(f(x,y)\), enteros en \([0,255]\).
  • \(N\) líneas siguientes: tabla de cuantización \(Q\), enteros positivos.

Salida:

  • Bloque reconstruido \(f'(x,y)\), \(N \times N\), enteros en \([0,255]\), separados por espacios.

5.13.5.5 📌 Ejemplos

Entrada Salida Observación
4
120 130 125 128
115 140 135 122
118 150 160 130
110 120 145 138
4 6 8 10
6 8 10 12
8 10 12 16
10 12 16 20
118 126 119 131
114 143 140 119
117 149 159 130
107 121 146 139
Tras la DCT, cuantización agresiva en las altas frecuencias (valores grandes de \(Q\) en la esquina inferior derecha) y reconstrucción vía IDCT, el bloque queda cercano al original, pero no idéntico — la diferencia es el costo de la compresión lossy.

5.13.5.6 💡 Consejo de Depuración

Si el resultado no coincide, verifique en este orden: (1) los coeficientes DCT brutos (antes de la cuantización) — deben reconstruir el original exactamente vía IDCT si omite las etapas 6–7; (2) la tabla \(\alpha(u)\) — error común es aplicar \(\sqrt{2/N}\) también para \(u=0\); (3) el redondeo de la cuantización, que debe ocurrir antes de multiplicar de vuelta por \(Q\).

🎮 Simulador EP05_05: Pipeline JPEG (Bloque 4×4) DCT → Q → IDCT
Ajusta el factor de escala de cuantización y observa el bloque reconstruido alejarse (o acercarse) del original.
Bloque Original
Reconstruido (DCT → Q → IDCT)
–
Figura 5.36: Simulador EP05_05: Pipeline JPEG completo en bloques
%%writefile EP05_05.cpp
// your solution
Overwriting EP05_05.cpp
TestSuite("EP05_05.cpp").run()
✔️ EP05_05.cases ya existe en casos/
📋 5 caso(s) cargado(s) de casos/EP05_05.cases

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