EDI+VA · Esercizio di Programmazione

EP05_03 — 🟠 Quantizzazione DCT: la Vera Fonte di Compressione

5.18.3 EP05_03 🟠 Quantizzazione DCT: la Vera Fonte di Compressione

Un’applicazione di galleria fotografica deve ridurre le dimensioni di migliaia di immagini prima di caricarle sul cloud, senza ricodificare tutto da zero. L’ingegnere responsabile ha già i coefficienti DCT di ogni blocco \(4\times4\) calcolati (la fase computazionalmente onerosa è già stata eseguita) — manca solo applicare la tabella di quantizzazione, la fase che scarta realmente informazioni e genera compressione. I coefficienti ad alta frequenza, meno percettibili all’occhio umano, ricevono divisori grandi e tendono a diventare zero; i coefficienti a bassa frequenza, più percettibili, ricevono divisori piccoli e sopravvivono quasi intatti.

Dovrai implementare esattamente questa fase: quantizzare e dequantizzare (dividere, arrotondare, moltiplicare di nuovo) — il cuore della compressione lossy del JPEG.

5.18.3.1 📋 Linee Guida di Implementazione

  1. Dimensione del blocco: Leggere l’intero \(N\) (blocco \(N \times N\)).
  2. Coefficienti: Leggere la matrice \(C\) dei coefficienti DCT, \(N\) righe con \(N\) interi ciascuna (possono essere negativi).
  3. Tabella di quantizzazione: Leggere la matrice \(Q\), \(N\) righe con \(N\) interi positivi ciascuna.
  4. Quantizzazione: Per ogni posizione \((u,v)\), calcolare l’indice quantizzato \[ \tilde{C}(u,v) = \text{round}\!\left(\frac{C(u,v)}{Q(u,v)}\right) \] usando l’arrotondamento standard all’intero più vicino (i valori intermedi .5 non si verificano mai nei casi di test).
  5. Dequantizzazione (ricostruzione): Calcolare \[ C'(u,v) = \tilde{C}(u,v) \times Q(u,v) \]
  6. Output: Visualizzare la matrice ricostruita \(C'\), \(N \times N\), di interi.

5.18.3.2 📌 Vincoli Computazionali

  • Round-trip completo: l’output è il coefficiente ricostruito (\(\tilde{C} \times Q\)), non l’indice quantizzato isolato.
  • Divisione in virgola mobile: la divisione \(C(u,v)/Q(u,v)\) deve essere eseguita in virgola mobile prima dell’arrotondamento — la divisione intera troncata produrrà un risultato errato.
  • Segno preservato: i coefficienti negativi mantengono il segno dopo la quantizzazione e la ricostruzione.
  • \(Q(u,v) > 0\) sempre: non è necessario gestire la divisione per zero.

5.18.3.3 🧠 Fondamenti Teorici

Coefficiente Frequenza Valore tipico di \(Q\) Effetto della quantizzazione
\(C(0,0)\) DC (media del blocco) Piccolo Quasi sempre sopravvive — domina l’energia
\(C(u,v)\) con \(u+v\) basso Bassa frequenza Piccolo/medio Parzialmente preservato
\(C(u,v)\) con \(u+v\) alto Alta frequenza Grande Spesso diventa zero — fonte della compressione

5.18.3.4 📦 Specifica di Input e Output (VPL)

Input:

  • Riga 1: Intero \(N\).
  • \(N\) righe successive: matrice \(C\) (coefficienti DCT, interi, possono essere negativi).
  • \(N\) righe successive: matrice \(Q\) (tabella di quantizzazione, interi positivi).

Output:

  • Matrice ricostruita \(C'\), \(N \times N\), interi separati da spazio.

5.18.3.5 📌 Esempi

Input Output Osservazione
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\) (preservato). \(C(0,2)=-5/7\approx-0.71\to-1\to-1\times7=-7\). Invece \(C(1,1)=-3/7\approx-0.43\to0\): azzerato dalla quantizzazione — la maggior parte del blocco diventa zero, illustrando la compattazione dell’energia nell’angolo superiore sinistro.
🎮 Simulatore EP05_03: Quantizzazione DCT round(C / Q) × Q
Regola la scala di Q e osserva quanti coefficienti sopravvivono (diversi da zero) dopo il round-trip.
Coefficienti DCT (C)
Ricostruito (round(C / Q) · Q)
–
Figura 5.34: Simulatore EP05_03: Quantizzazione DCT (round-trip)
%%writefile EP05_03.cpp
// your solution
Overwriting EP05_03.cpp
TestSuite("EP05_03.cpp").run()
✔️ EP05_03.cases esiste già in casos/
📋 5 caso/i caricato/i da casos/EP05_03.cases

🔍 Test di C++: EP05_03.cpp
⚠️ EP05_03.cpp: file vuoto (meno di 3 righe). Test saltati.