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
- Dimensión del bloque: Leer el entero \(N\) (bloque \(N \times N\)).
- Coeficientes: Leer la matriz \(C\) de coeficientes DCT, \(N\) filas con \(N\) enteros cada una (pueden ser negativos).
- Tabla de cuantización: Leer la matriz \(Q\), \(N\) filas con \(N\) enteros positivos cada una.
- 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
.5nunca ocurren en los casos de prueba). - Descuantización (reconstrucción): Calcular \[ C'(u,v) = \tilde{C}(u,v) \times Q(u,v) \]
- 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. |
%%writefile EP05_03.cpp
// your solutionOverwriting 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.