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
- Dimensione del blocco: Leggere l’intero \(N\) (blocco \(N \times N\)).
- Coefficienti: Leggere la matrice \(C\) dei coefficienti DCT, \(N\) righe con \(N\) interi ciascuna (possono essere negativi).
- Tabella di quantizzazione: Leggere la matrice \(Q\), \(N\) righe con \(N\) interi positivi ciascuna.
- 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
.5non si verificano mai nei casi di test). - Dequantizzazione (ricostruzione): Calcolare \[ C'(u,v) = \tilde{C}(u,v) \times Q(u,v) \]
- 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. |
%%writefile EP05_03.cpp
// your solutionOverwriting 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.