5.13.3 EP05_03 🟠 Quantification DCT : la véritable source de compression
Une application de galerie de photos doit réduire la taille de milliers d’images avant de les téléverser vers le cloud, sans tout recoder de zéro. L’ingénieur responsable dispose déjà des coefficients DCT de chaque bloc \(4\times4\) calculés (l’étape coûteuse en calcul est déjà faite) — il ne reste plus qu’à appliquer la table de quantification, l’étape qui élimine réellement de l’information et génère la compression. Les coefficients haute fréquence, moins perceptibles à l’œil humain, reçoivent de grands diviseurs et tendent à devenir zéro ; les coefficients basse fréquence, plus perceptibles, reçoivent de petits diviseurs et survivent presque intacts.
Vous allez implémenter exactement cette étape : quantifier et déquantifier (diviser, arrondir, multiplier en retour) — le cœur de la compression lossy du JPEG.
5.13.3.1 📋 Directives d’implémentation
- Dimension du bloc : Lire l’entier \(N\) (bloc \(N \times N\)).
- Coefficients : Lire la matrice \(C\) des coefficients DCT, \(N\) lignes avec \(N\) entiers chacune (ils peuvent être négatifs).
- Table de quantification : Lire la matrice \(Q\), \(N\) lignes avec \(N\) entiers positifs chacune.
- Quantification : Pour chaque position \((u,v)\), calculer l’indice quantifié \[
\tilde{C}(u,v) = \text{round}\!\left(\frac{C(u,v)}{Q(u,v)}\right)
\] en utilisant l’arrondi standard à l’entier le plus proche (les valeurs intermédiaires
.5ne se produisent jamais dans les cas de test). - Déquantification (reconstruction) : Calculer \[ C'(u,v) = \tilde{C}(u,v) \times Q(u,v) \]
- Sortie : Afficher la matrice reconstruite \(C'\), \(N \times N\), entiers.
5.13.3.2 📌 Contraintes informatiques
- Aller-retour complet : la sortie est le coefficient reconstruit (\(\tilde{C} \times Q\)), pas l’indice quantifié isolé.
- Division en virgule flottante : la division \(C(u,v)/Q(u,v)\) doit être effectuée en virgule flottante avant l’arrondi — une division entière tronquée produirait un résultat incorrect.
- Signe préservé : les coefficients négatifs conservent leur signe après quantification et reconstruction.
- \(Q(u,v) > 0\) toujours : aucune gestion de division par zéro n’est nécessaire.
5.13.3.3 🧠 Fondements théoriques
| Coefficient | Fréquence | Valeur typique de \(Q\) | Effet de la quantification |
|---|---|---|---|
| \(C(0,0)\) | DC (moyenne du bloc) | Petite | Survit presque toujours — domine l’énergie |
| \(C(u,v)\) faible \(u+v\) | Basse fréquence | Petite/moyenne | Partiellement préservé |
| \(C(u,v)\) élevé \(u+v\) | Haute fréquence | Grande | Devient souvent zéro — source de la compression |
5.13.3.4 📦 Spécification d’entrée et de sortie (VPL)
Entrée :
- Ligne 1 : Entier \(N\).
- \(N\) lignes suivantes : matrice \(C\) (coefficients DCT, entiers, peuvent être négatifs).
- \(N\) lignes suivantes : matrice \(Q\) (table de quantification, entiers positifs).
Sortie :
- Matrice reconstruite \(C'\), \(N \times N\), entiers séparés par des espaces.
5.13.3.5 📌 Exemples
| Entrée | Sortie | Observation |
|---|---|---|
| 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\) (préservé). \(C(0,2)=-5/7\approx-0.71\to-1\to-1\times7=-7\). Quant à \(C(1,1)=-3/7\approx-0.43\to0\) : mis à zéro par la quantification — la majeure partie du bloc devient zéro, illustrant la compaction de l’énergie dans le coin supérieur gauche. |
%%writefile EP05_03.cpp
// your solutionOverwriting EP05_03.cpp
TestSuite("EP05_03.cpp").run()✔️ EP05_03.cases existe déjà dans casos/
📋 5 cas chargé(s) depuis casos/EP05_03.cases
🔍 Test de C++ : EP05_03.cpp
⚠️ EP05_03.cpp : fichier vide (moins de 3 lignes). Tests ignorés.