DIP+CV · Programming Exercise

EP05_05 — 🏆 Complete JPEG Pipeline: DCT, Quantization, and Reconstruction

5.13.5 EP05_05 🏆 Complete JPEG Pipeline: DCT, Quantization, and Reconstruction

You have been hired to create, from scratch, a didactic JPEG codec in an embedded environment, without any available image library—only basic mathematical operations. The client wants to understand exactly where quality is lost and where it is recovered, block by block. This is the final challenge of the chapter: integrate everything that has been studied—the orthonormal DCT-II, perceptual quantization, and IDCT-based reconstruction—into a single end-to-end pipeline, processing an \(N \times N\) block from start to finish, exactly as the JPEG standard does internally, \(8\times8\) pixels at a time.

5.13.5.1 📋 Implementation Guidelines

  1. Block dimension: Read the integer \(N\).
  2. Original block: Read the pixel matrix \(f(x,y)\), \(N\) rows with \(N\) integers in \([0,255]\).
  3. Quantization table: Read the matrix \(Q\), \(N \times N\) positive integers.
  4. Centering: Subtract 128 from each pixel: \(g(x,y) = f(x,y) - 128\).
  5. Orthonormal 2D DCT-II: Compute \[ 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] \] with \(\alpha(0)=\sqrt{1/N}\) and \(\alpha(k)=\sqrt{2/N}\) for \(k>0\).
  6. Quantization: \(\tilde{C}(u,v) = \text{round}(C(u,v)/Q(u,v))\).
  7. Dequantization: \(C'(u,v) = \tilde{C}(u,v)\times Q(u,v)\).
  8. 2D IDCT-II (orthonormal inverse): Compute \(g'(x,y)\) from \(C'(u,v)\) using the corresponding inverse transform (same basis, summation over \(u,v\)).
  9. Centering reversal and rounding: \(f'(x,y) = \text{round}(g'(x,y) + 128)\), restricted to the interval \([0,255]\) (clipping).
  10. Output: Display the reconstructed block \(f'\), \(N \times N\), integers.

5.13.5.2 📌 Computational Constraints

  • *Complete pipeline mandatory: all six stages (center, DCT, quantize, dequantize, IDCT, revert) must be implemented—skipping quantization will not pass the tests, as the result would be identical to the original.
  • *Clipping: reconstructed values outside \([0,255]\) must be truncated (0 if negative, 255 if greater than 255).
  • Rounding: both in quantization and in final pixel reconstruction, use standard rounding; the test cases avoid .5 ambiguity.
  • Orthonormal basis: the normalization \(\alpha(u)\) and \(\alpha(v)\) must be applied exactly as specified—without it, the IDCT will not reconstruct correctly.

5.13.5.3 🧠 Theoretical Foundation

Stage Analogous in the real JPEG standard Where quality is lost
Centering Same—DCT assumes a signal centered at zero No loss
DCT-II Steps 3–4 of the pipeline (Table 5.7) No loss (exact and reversible transformation)
Quantization Step 5—division by \(Q(u,v)\) Main source of loss—high-frequency coefficients become zero
IDCT Final reconstruction Reconstructs exactly the quantized coefficients, not the original ones

5.13.5.4 📦 Input and Output Specification (VPL)

Input:

  • Line 1: Integer \(N\).
  • Next \(N\) lines: original block \(f(x,y)\), integers in \([0,255]\).
  • Next \(N\) lines: quantization table \(Q\), positive integers.

Output:

  • Reconstructed block \(f'(x,y)\), \(N \times N\), integers in \([0,255]\), separated by spaces.

5.13.5.5 📌 Examples

Input Output Observation
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
After DCT, aggressive quantization of high frequencies (large \(Q\) values in the lower-right corner) and IDCT-based reconstruction, the block remains close to the original but not identical—the difference is the cost of lossy compression.

5.13.5.6 💡 Debugging Tip

If the result does not match, check in this order: (1) the raw DCT coefficients (before quantization)—they should reconstruct the original exactly via IDCT if you skip steps 6–7; (2) the \(\alpha(u)\) table—a common mistake is applying \(\sqrt{2/N}\) also for \(u=0\); (3) the quantization rounding, which must occur before multiplying back by \(Q\).

🎮 Simulator EP05_05: JPEG Pipeline (Block 4×4) DCT → Q → IDCT
Adjust the quantization scale factor and watch the reconstructed block move away from (or closer to) the original.
Original Block
Reconstructed (DCT → Q → IDCT)
–
Figure 5.36: EP05_05 Simulator: Complete JPEG pipeline in block
%%writefile EP05_05.cpp
// your solution
Overwriting EP05_05.cpp
TestSuite("EP05_05.cpp").run()
✔️ EP05_05.cases already exists in casos/
📋 5 case(s) loaded from casos/EP05_05.cases

🔍 Testing C++: EP05_05.cpp
⚠️ EP05_05.cpp: Empty file (fewer than 3 lines). Tests skipped.