TNI+VO · Exercice de Programmation

EP07_04 — 🟠 Codage Manuel du Descripteur LBP

7.18.4 EP07_04 🟠 Codage Manuel du Descripteur LBP

La fonction local_binary_pattern de scikit-image, utilisée dans le projet de classification de textures, calcule automatiquement le code LBP de chaque pixel d’une image. Avant de l’utiliser comme une boîte noire, vous avez été chargé d’implémenter manuellement le calcul du code LBP classique (\(P=8\), \(R=1\)) pour le pixel central d’un voisinage \(3\times3\), exactement comme défini dans l’équation du chapitre.

En plus du code, le système d’inspection de textures doit également savoir si ce motif est uniforme — un motif est uniforme lorsque le nombre de transitions (\(0\to1\) ou \(1\to0\)) en parcourant les 8 bits circulairement (en revenant du dernier bit au premier) est au plus 2, propriété exploitée par la variante uniforme du LBP mentionnée dans le chapitre.

7.18.4.1 📋 Directives d’Implémentation

  1. Quantité : Lire l’entier \(T\) (nombre de voisinages à traiter).
  2. Données de chaque voisinage : Pour chacun des \(T\) voisinages, lire une matrice \(3\times3\) d’entiers (intensités), fournie en 3 lignes de 3 valeurs chacune. Le pixel central est la position [1][1].
  3. Ordre des voisins : Parcourir les 8 voisins dans le sens horaire, en commençant par le coin supérieur gauche, dans l’ordre suivant des positions [ligne][colonne] : [0][0], [0][1], [0][2], [1][2], [2][2], [2][1], [2][0], [1][0]. C’est l’indice \(p = 0, 1, \ldots, 7\) de l’équation du LBP.
  4. Fonction seuil : Pour chaque voisin \(p\) avec une intensité \(g_p\) et un centre \(g_c\), calculer \(s(g_p - g_c)\), qui vaut 1 si \(g_p \geq g_c\) et 0 sinon.
  5. Code LBP : Calculer \[ \mathrm{LBP} = \sum_{p=0}^{7} s(g_p - g_c)\, 2^p. \]
  6. Transitions : En considérant la séquence circulaire de bits \(s_0, s_1, \ldots, s_7\) (dans l’ordre du point 3), compter combien de paires consécutives adjacentes dans la séquence circulaire (y compris la paire \(s_7, s_0\)) diffèrent entre elles.
  7. Classification : Si le nombre de transitions est \(\le 2\), classer comme UNIFORME ; sinon, NAO_UNIFORME.
  8. Sortie : Pour chaque voisinage, dans l’ordre d’entrée, imprimer le code LBP (entier décimal, \(0\)–\(255\)), le nombre de transitions et la classification.

7.18.4.2 📌 Contraintes Computationnelles

  • Ordre fixe des voisins : l’ordre du point 3 est obligatoire — l’inverser produit un code numériquement différent, même en représentant le même motif visuel.
  • Comparaison non stricte : \(s(z) = 1\) lorsque \(z \ge 0\) (le chapitre lui-même définit l’égalité comme incluse dans le cas 1).
  • Comptage circulaire : ne pas oublier la paire qui ferme le cycle (\(s_7\) avec \(s_0\)) ; ignorer cette paire est une erreur courante qui classe incorrectement les motifs uniformes.

7.18.4.3 🧠 Fondement Théorique

Motif (bits \(s_0\ldots s_7\)) Transitions Interprétation
00000000 ou 11111111 0 Région homogène (tache claire ou sombre)
00001111 2 Bord simple entre deux régions
01010101 8 Texture de contraste alterné — non uniforme

Les motifs uniformes se concentrent dans les régions de texture lisse ou de bords simples ; les motifs non uniformes tendent à correspondre à du bruit haute fréquence. C’est pourquoi l’histogramme LBP uniforme, utilisé dans le projet de classification de textures, regroupe tous les motifs non uniformes dans un seul compartiment, réduisant la dimensionnalité du descripteur.

7.18.4.4 📦 Spécification d’Entrée et de Sortie (VPL)

Entrée :

  • Ligne 1 : Entier \(T\).
  • Pour chaque voisinage : 3 lignes avec 3 entiers chacune (matrice \(3\times3\)).

Sortie :

  • \(T\) lignes, au format LBP=<int> transicoes=<int> <UNIFORME|NAO_UNIFORME>.

7.18.4.5 📌 Exemples

Entrée Sortie Observation
1
10 10 10
10 50 10
10 10 10
LBP=0 transicoes=0 UNIFORME Le centre est le plus clair ; tous les voisins génèrent un bit 0.
1
90 90 90
10 50 10
90 90 90
LBP=119 transicoes=4 NAO_UNIFORME Voisins clairs et sombres alternés dans le voisinage.
🎮 Simulateur EP07_04 : Code LBP d'un voisinage 3×3 P = 8, R = 1
Cliquez sur une cellule du voisinage pour basculer entre clair et sombre (le centre est fixe) et observez le code LBP résultant. Le libellé p indique l'indice de l'équation.
–
Figure 7.24: Simulateur EP07_04 : Code LBP d’un voisinage 3×3
%%writefile EP07_04.py
# Code Python
Overwriting EP07_04.py
TestSuite("EP07_04.py").run()
✔️ EP07_04.cases existe déjà dans casos/
📋 5 cas chargé(s) depuis casos/EP07_04.cases

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