TNI+VO · Exercice de Programmation

EP05_03 — 🟠 Quantification DCT : la véritable source de compression

6.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.

6.13.3.1 📋 Directives d’implémentation

  1. Dimension du bloc : Lire l’entier \(N\) (bloc \(N \times N\)).
  2. Coefficients : Lire la matrice \(C\) des coefficients DCT, \(N\) lignes avec \(N\) entiers chacune (ils peuvent être négatifs).
  3. Table de quantification : Lire la matrice \(Q\), \(N\) lignes avec \(N\) entiers positifs chacune.
  4. 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 .5 ne se produisent jamais dans les cas de test).
  5. Déquantification (reconstruction) : Calculer \[ C'(u,v) = \tilde{C}(u,v) \times Q(u,v) \]
  6. Sortie : Afficher la matrice reconstruite \(C'\), \(N \times N\), entiers.

6.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.

6.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

6.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.

6.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.
🎮 Simulateur EP05_03 : Quantification DCT round(C / Q) × Q
Ajustez l'échelle de Q et voyez combien de coefficients survivent (non nuls) après l'aller-retour.
Coefficients DCT (C)
Reconstruit (round(C / Q) · Q)
–
Figure 6.34: Simulateur EP05_03 : Quantification DCT (round-trip)
%%writefile EP05_03.py
# Code Python
Overwriting EP05_03.py
TestSuite("EP05_03.py").run()
✔️ EP05_03.cases existe déjà dans casos/
📋 5 cas chargé(s) depuis casos/EP05_03.cases

🔍 Test de Python : EP05_03.py
⚠️ EP05_03.py : fichier vide (moins de 3 lignes). Tests ignorés.