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
- Quantità: Leggere l’intero \(T\) (numero di intorni da elaborare).
- 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]. - 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. - Funzione soglia: Per ogni vicino \(p\) con intensità \(g_p\) e centro \(g_c\), calcolare \(s(g_p - g_c)\), che vale
1se \(g_p \geq g_c\) e0altrimenti. - Codice LBP: Calcolare \[ \mathrm{LBP} = \sum_{p=0}^{7} s(g_p - g_c)\, 2^p. \]
- 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.
- Classificazione: Se il numero di transizioni è \(\le 2\), classificare come
UNIFORME; altrimenti,NAO_UNIFORME. - 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. |
%%writefile EP07_04.py
# Codice PythonOverwriting 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.