6.14.5 EP06_05 🟠 Normalizzazione del fondo per divisione (Correzione dell’illuminazione)
Un modulo è stato fotografato in condizioni di illuminazione non uniforme, facendo sì che un lato del foglio appaia più chiaro dell’altro. In queste condizioni, la sogliatura globale di Otsu può produrre risultati insoddisfacenti, poiché una singola soglia non separa adeguatamente testo e sfondo in tutta l’immagine. La soluzione presentata nel capitolo consiste nel normalizzare lo sfondo, dividendo l’immagine originale per una versione fortemente smussata di se stessa, che rappresenta l’illuminazione a bassa frequenza.
In questo esercizio, l’immagine originale e lo sfondo smussato (equivalente al risultato di un cv2.GaussianBlur con \(\sigma\) elevato) sono già forniti. Il tuo compito è implementare la fase di normalizzazione che produce l’immagine corretta.
6.14.5.1 📋 Linee guida di implementazione
- Dimensioni: Leggere gli interi \(L\) (righe) e \(C\) (colonne).
- Immagine originale: Leggere i valori interi \(L \times C\) della matrice
img(intensità tra 0 e 255). - Sfondo stimato: Leggere i valori interi \(L \times C\) della matrice
bg(intensità tra 0 e 255, sempre strettamente maggiori di zero). - Normalizzazione: Per ogni posizione \((i,j)\), calcolare \[ \text{valore}(i,j)= \frac{\text{img}(i,j)}{\text{bg}(i,j)}\times255. \]
- Arrotondamento: Arrotondare il risultato all’intero più vicino (round half away from zero, con
np.floor(img + 0.5)). - Saturazione: Limitare il valore ottenuto all’intervallo \([0,255]\).
- Uscita: Stampare la matrice
img_normrisultante.
6.14.5.2 📌 Vincoli computazionali
- Divisione per zero: l’input garantisce \(\text{bg}(i,j)>0\) in tutte le posizioni.
- Ordine delle operazioni: prima arrotondare, poi applicare la saturazione.
- Elaborazione indipendente: ogni pixel deve essere normalizzato singolarmente, senza utilizzare informazioni dai pixel vicini.
6.14.5.3 🧠 Fondamenti teorici
| Situazione | Effetto della normalizzazione |
|---|---|
| \(\text{img}(i,j)=\text{bg}(i,j)\) | Risultato pari a \(255\), corrispondente allo sfondo normalizzato. |
| \(\text{img}(i,j)<\text{bg}(i,j)\) | Risultato inferiore a \(255\), preservando le regioni più scure, come il testo. |
| \(\text{img}(i,j)>\text{bg}(i,j)\) | Risultato superiore a \(255\), successivamente saturato. |
| Sfondo con illuminazione non uniforme | La divisione riduce le variazioni lente dell’illuminazione, rendendo l’immagine più omogenea. |
La divisione per lo sfondo stimato riduce gli effetti dell’illuminazione non uniforme e preserva il contrasto tra primo piano e sfondo, facilitando le fasi successive di segmentazione.
6.14.5.4 📦 Specifica di input e output (VPL)
Input:
- Riga 1: Intero \(L\).
- Riga 2: Intero \(C\).
- Prossime \(L\) righe: elementi della matrice
img. - Prossime \(L\) righe: elementi della matrice
bg.
Output:
- Matrice
img_norm, con \(L\) righe e \(C\) colonne, contenente valori interi separati da spazi.
6.14.5.5 📌 Esempi
| Input | Output | Osservazione |
|---|---|---|
| 2 2 60 120 180 40 100 100 200 80 |
153 255 230 128 |
I valori superiori a \(255\) devono essere saturati; \(180/200\times255=229{,}5\) risulta in \(230\) dopo l’arrotondamento. |
| 1 3 30 60 90 60 60 60 |
128 255 255 | Solo il primo valore rimane al di sotto di \(255\) dopo la normalizzazione. |
%%writefile EP06_05.py
# Codice PythonOverwriting EP06_05.py
TestSuite("EP06_05.py").run()✔️ EP06_05.cases esiste già in casos/
📋 5 caso/i caricato/i da casos/EP06_05.cases
🔍 Test di Python: EP06_05.py
⚠️ EP06_05.py: file vuoto (meno di 3 righe). Test saltati.