EDI+VA · Esercizio di Programmazione

EP04_02 — 📊 Soglia Automatica di Otsu

4.9.2 EP04_02 📊 Soglia Automatica di Otsu

Scegliere manualmente la soglia \(T\) funziona quando l’illuminazione è stabile, ma in microscopia digitale e nell’ispezione di strisci di sangue, ogni campione ha un contrasto diverso — una soglia fissa fallirebbe da un’immagine all’altra. Il metodo di Otsu risolve questo problema trovando, da solo, la soglia che massimizza la separazione statistica tra le due classi di pixel, rendendo la segmentazione automatica e adattiva. Vedi in Figura 4.31 una simulazione di questo EP.

4.9.2.1 📋 Linee Guida di Implementazione

  1. Dimensioni: Leggere gli interi \(L\) (righe) e \(C\) (colonne).

  2. Dati: Leggere i valori interi della matrice originale riga per riga.

  3. Istogramma: Costruire l’istogramma \(h[i]\), \(i=0,\dots,255\), contando quanti pixel hanno valore \(i\).

  4. Ricerca della soglia: Per ogni candidato \(T\) da \(1\) a \(255\), calcolare la varianza tra le classi: \[ \sigma_B^2(T) = \frac{n_0 \cdot n_1}{N^2}\,(m_0 - m_1)^2 \] dove \(n_0,n_1\) sono le quantità di pixel con valore \(<T\) e \(\geq T\), \(m_0,m_1\) sono le loro medie, e \(N=L\times C\).

  5. Scelta: La soglia ottimale \(T^*\) è quella che massimizza \(\sigma_B^2(T)\) (in caso di pareggio, mantenere la prima trovata).

  6. Applicazione: Binarizzare l’immagine usando T*, applicando: \[ p' = \begin{cases} 255, & \text{se } p > T^* \\ 0, & \text{se } p \le T^* \end{cases} \]

4.9.2.2 📌 Vincoli Computazionali

  • Candidati validi: Ignorare \(T\) che lasci \(n_0=0\) o \(n_1=0\) (classe vuota).
  • Pareggio: Mantenere sempre la prima \(T\) che ha raggiunto il valore massimo di \(\sigma_B^2\).
  • Tipo: \(T^*\) e la matrice di uscita devono essere interi.
  • Convenzione OpenCV: La binarizzazione segue cv2.THRESL_BINARY; i pixel con valore esattamente uguale a \(T^*\) diventano neri.

4.9.2.3 🧠 Fondamenti Teorici

Concetto Significato Impatto
\(\sigma_B^2(T)\) alta Classi ben separate in \(T\) \(T\) è un buon candidato come soglia
Istogramma bimodale Due “colline” distinte Otsu trova la valle tra di esse
Istogramma unimodale Una sola “collina” Otsu sceglie comunque qualche \(T\), ma la segmentazione è poco affidabile

4.9.2.4 📦 Specifica di Input e Output (VPL)

Input:

  • Riga 1: Intero \(L\).
  • Riga 2: Intero \(C\).
  • Righe successive: Elementi interi della matrice originale.

Output:

  • Matrice binarizzata in \(L\) righe e \(C\) colonne, valori \(0\) o \(255\).

4.9.2.5 📌 Esempi

Input Output Osservazione
4
4
12 12 12 200
12 12 200 200
12 200 200 200
200 200 200 200
0 0 0 255
0 0 255 255
0 255 255 255
255 255 255 255
Istogramma bimodale chiaro: 12 e 200
1
2
10 250
0 250 Solo due valori: \(T^*\) si colloca sul maggiore
📊 Simulatore EP04_02: Otsu Automatico T* = argmax σ²_B(T)

👆 Clic sinistro scurisce (−25) e clic con tasto destro schiarisce (+25) i pixel dell'input. Osserva la soglia ottimale T* adattarsi dinamicamente all'istogramma.

T* = −

Input Originale (Cliccabile)
Risultato Otsu (p')
Figura 4.31: Simulatore EP04_02: Sogliatura Automatica di Otsu (T* = argmax σ²_B(T))
%%writefile EP04_02.py
# Codice Python
Overwriting EP04_02.py
TestSuite("EP04_02.py").run()
✔️ EP04_02.cases esiste già in casos/
📋 5 caso/i caricato/i da casos/EP04_02.cases

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