TNI+VO · Exercice de Programmation

EP06_05 — 🟠 Normalisation du fond par division (correction de l’éclairage)

6.14.5 EP06_05 🟠 Normalisation du fond par division (correction de l’éclairage)

Un formulaire a été photographié sous un éclairage non uniforme, ce qui fait qu’un côté de la feuille apparaît plus clair que l’autre. Dans ces conditions, le seuillage global par Otsu peut produire des résultats insatisfaisants, car un seul seuil ne sépare pas correctement le texte et le fond sur toute l’image. La solution présentée dans le chapitre consiste à normaliser le fond, en divisant l’image originale par une version fortement lissée d’elle-même, qui représente l’éclairage basse fréquence.

Dans cet exercice, l’image originale et le fond lissé (équivalent au résultat d’un cv2.GaussianBlur avec un \(\sigma\) élevé) sont déjà fournis. Votre tâche consiste à implémenter l’étape de normalisation qui produit l’image corrigée.

6.14.5.1 📋 Directives d’implémentation

  1. Dimensions : Lire les entiers \(L\) (lignes) et \(C\) (colonnes).
  2. Image originale : Lire les \(L \times C\) valeurs entières de la matrice img (intensités entre 0 et 255).
  3. Fond estimé : Lire les \(L \times C\) valeurs entières de la matrice bg (intensités entre 0 et 255, toujours strictement supérieures à zéro).
  4. Normalisation : Pour chaque position \((i,j)\), calculer \[ \text{valeur}(i,j)= \frac{\text{img}(i,j)}{\text{bg}(i,j)}\times255. \]
  5. Arrondi : Arrondir le résultat à l’entier le plus proche (round half away from zero, avec np.floor(img + 0.5)).
  6. Saturation : Limiter la valeur obtenue à l’intervalle \([0,255]\).
  7. Sortie : Imprimer la matrice img_norm résultante.

6.14.5.2 📌 Contraintes de calcul

  • Division par zéro : l’entrée garantit \(\text{bg}(i,j)>0\) à toutes les positions.
  • Ordre des opérations : d’abord arrondir, puis appliquer la saturation.
  • Traitement indépendant : chaque pixel doit être normalisé individuellement, sans utiliser les informations des pixels voisins.

6.14.5.3 🧠 Fondement théorique

Situation Effet de la normalisation
\(\text{img}(i,j)=\text{bg}(i,j)\) Résultat égal à \(255\), correspondant au fond normalisé.
\(\text{img}(i,j)<\text{bg}(i,j)\) Résultat inférieur à \(255\), préservant les régions plus sombres, comme le texte.
\(\text{img}(i,j)>\text{bg}(i,j)\) Résultat supérieur à \(255\), ensuite saturé.
Fond avec éclairage non uniforme La division réduit les variations lentes de l’éclairage, rendant l’image plus homogène.

La division par le fond estimé réduit les effets de l’éclairage non uniforme et préserve le contraste entre le premier plan et le fond, facilitant les étapes ultérieures de segmentation.

6.14.5.4 📦 Spécification des entrées et sorties (VPL)

Entrée :

  • Ligne 1 : Entier \(L\).
  • Ligne 2 : Entier \(C\).
  • Les \(L\) lignes suivantes : éléments de la matrice img.
  • Les \(L\) lignes suivantes : éléments de la matrice bg.

Sortie :

  • Matrice img_norm, avec \(L\) lignes et \(C\) colonnes, contenant des valeurs entières séparées par des espaces.

6.14.5.5 📌 Exemples

Entrée Sortie Observation
2
2
60 120
180 40
100 100
200 80
153 255
230 128
Les valeurs supérieures à \(255\) doivent être saturées ; \(180/200\times255=229{,}5\) donne \(230\) après arrondi.
1
3
30 60 90
60 60 60
128 255 255 Seule la première valeur reste inférieure à \(255\) après la normalisation.
🎮 Simulateur EP06_05 : Normalisation de fond par division (img / bg) × 255
Ajustez le gradient de fond (gauche → droite) et observez comment la division annule la variation d'éclairage.
img (Original)
bg (Fond lissé)
img_norm (Sortie)
–
Figure 6.25: Simulateur EP06_05: Normalisation du fond par division
%%writefile EP06_05.py
# Code Python
Overwriting EP06_05.py
TestSuite("EP06_05.py").run()
✔️ EP06_05.cases existe déjà dans casos/
📋 5 cas chargé(s) depuis casos/EP06_05.cases

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