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
- Dimensions : Lire les entiers \(L\) (lignes) et \(C\) (colonnes).
- Image originale : Lire les \(L \times C\) valeurs entières de la matrice
img(intensités entre 0 et 255). - 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). - Normalisation : Pour chaque position \((i,j)\), calculer \[ \text{valeur}(i,j)= \frac{\text{img}(i,j)}{\text{bg}(i,j)}\times255. \]
- Arrondi : Arrondir le résultat à l’entier le plus proche (round half away from zero, avec
np.floor(img + 0.5)). - Saturation : Limiter la valeur obtenue à l’intervalle \([0,255]\).
- Sortie : Imprimer la matrice
img_normré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. |
%%writefile EP06_05.py
# Code PythonOverwriting 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.