EDI+VA · Esercizio di Programmazione

EP07_04 — 🟠 Codifica Manuale del Descrittore LBP

7.18.4 EP07_04 🟠 Codifica Manuale del Descrittore LBP

La funzione local_binary_pattern di scikit-image, utilizzata nel progetto di classificazione delle trame, calcola automaticamente il codice LBP di ogni pixel di un’immagine. Prima di utilizzarla come una scatola nera, ti è stato affidato il compito di implementare manualmente il calcolo del codice LBP classico (\(P=8\), \(R=1\)) per il pixel centrale di un intorno \(3\times3\), esattamente come definito nell’equazione del capitolo.

Oltre al codice, il sistema di ispezione delle trame deve anche sapere se quel pattern è uniforme — un pattern è uniforme quando il numero di transizioni (\(0\to1\) o \(1\to0\)) percorrendo gli 8 bit circolarmente (tornando dall’ultimo bit al primo) è al massimo 2, proprietà sfruttata dalla variante uniforme del LBP menzionata nel capitolo.

7.18.4.1 📋 Linee Guida di Implementazione

  1. Quantità: Leggere l’intero \(T\) (numero di intorni da elaborare).
  2. Dati di ogni intorno: Per ciascuno dei \(T\) intorni, leggere una matrice \(3\times3\) di interi (intensità), fornita in 3 righe di 3 valori ciascuna. Il pixel centrale è la posizione [1][1].
  3. Ordine dei vicini: Percorrere gli 8 vicini in senso orario, partendo dall’angolo in alto a sinistra, nel seguente ordine di posizioni [riga][colonna]: [0][0], [0][1], [0][2], [1][2], [2][2], [2][1], [2][0], [1][0]. Questo è l’indice \(p = 0, 1, \ldots, 7\) dell’equazione del LBP.
  4. Funzione soglia: Per ogni vicino \(p\) con intensità \(g_p\) e centro \(g_c\), calcolare \(s(g_p - g_c)\), che vale 1 se \(g_p \geq g_c\) e 0 altrimenti.
  5. Codice LBP: Calcolare \[ \mathrm{LBP} = \sum_{p=0}^{7} s(g_p - g_c)\, 2^p. \]
  6. Transizioni: Considerando la sequenza circolare di bit \(s_0, s_1, \ldots, s_7\) (nell’ordine del punto 3), contare quante coppie consecutive adiacenti nella sequenza circolare (inclusa la coppia \(s_7, s_0\)) differiscono tra loro.
  7. Classificazione: Se il numero di transizioni è \(\le 2\), classificare come UNIFORME; altrimenti, NAO_UNIFORME.
  8. Uscita: Per ogni intorno, nell’ordine di ingresso, stampare il codice LBP (intero decimale, \(0\)–\(255\)), il numero di transizioni e la classificazione.

7.18.4.2 📌 Vincoli Computazionali

  • Ordine fisso dei vicini: l’ordine del punto 3 è obbligatorio — invertirlo produce un codice numericamente diverso, anche se rappresenta lo stesso pattern visivo.
  • Confronto non stretto: \(s(z) = 1\) quando \(z \ge 0\) (il capitolo stesso definisce l’uguaglianza come inclusa nel caso 1).
  • Conteggio circolare: non dimenticare la coppia che chiude il ciclo (\(s_7\) con \(s_0\)); ignorare questa coppia è un errore comune che classifica erroneamente i pattern uniformi.

7.18.4.3 🧠 Fondamento Teorico

Pattern (bit \(s_0\ldots s_7\)) Transizioni Interpretazione
00000000 o 11111111 0 Regione omogenea (macchia chiara o scura)
00001111 2 Bordo semplice tra due regioni
01010101 8 Trama a contrasto alternato — non uniforme

I pattern uniformi si concentrano in regioni di trama liscia o bordi semplici; i pattern non uniformi tendono a corrispondere a rumore ad alta frequenza. Per questo motivo, l’istogramma LBP uniforme, utilizzato nel progetto di classificazione delle trame, raggruppa tutti i pattern non uniformi in un unico contenitore, riducendo la dimensionalità del descrittore.

7.18.4.4 📦 Specifica di Ingresso e Uscita (VPL)

Ingresso:

  • Riga 1: Intero \(T\).
  • Per ogni intorno: 3 righe con 3 interi ciascuna (matrice \(3\times3\)).

Uscita:

  • \(T\) righe, nel formato LBP=<int> transicoes=<int> <UNIFORME|NAO_UNIFORME>.

7.18.4.5 📌 Esempi

Ingresso Uscita Osservazione
1
10 10 10
10 50 10
10 10 10
LBP=0 transicoes=0 UNIFORME Centro è il più chiaro; tutti i vicini generano bit 0.
1
90 90 90
10 50 10
90 90 90
LBP=119 transicoes=4 NAO_UNIFORME Vicini chiari e scuri alternati nell’intorno.
🎮 Simulatore EP07_04: Codice LBP di un Intorno 3×3 P = 8, R = 1
Fai clic su una cella dell'intorno per alternare tra chiaro e scuro (il centro è fisso) e osserva il codice LBP risultante. L'etichetta p indica l'indice dell'equazione.
–
Figura 7.24: Simulatore EP07_04: Codice LBP di un vicinato 3×3
%%writefile EP07_04.py
# Codice Python
Overwriting EP07_04.py
TestSuite("EP07_04.py").run()
✔️ EP07_04.cases esiste già in casos/
📋 5 caso/i caricato/i da casos/EP07_04.cases

🔍 Test di Python: EP07_04.py
⚠️ EP07_04.py: file vuoto (meno di 3 righe). Test saltati.