EDI+VA · Esercizio di Programmazione

EP06_05 — 🟠 Normalizzazione del fondo per divisione (Correzione dell’illuminazione)

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

  1. Dimensioni: Leggere gli interi \(L\) (righe) e \(C\) (colonne).
  2. Immagine originale: Leggere i valori interi \(L \times C\) della matrice img (intensità tra 0 e 255).
  3. Sfondo stimato: Leggere i valori interi \(L \times C\) della matrice bg (intensità tra 0 e 255, sempre strettamente maggiori di zero).
  4. Normalizzazione: Per ogni posizione \((i,j)\), calcolare \[ \text{valore}(i,j)= \frac{\text{img}(i,j)}{\text{bg}(i,j)}\times255. \]
  5. Arrotondamento: Arrotondare il risultato all’intero più vicino (round half away from zero, con np.floor(img + 0.5)).
  6. Saturazione: Limitare il valore ottenuto all’intervallo \([0,255]\).
  7. Uscita: Stampare la matrice img_norm risultante.

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.
🎮 Simulatore EP06_05: Normalizzazione dello Sfondo per Divisione (img / bg) × 255
Regola il gradiente di sfondo (sinistra → destra) e osserva come la divisione annulla la variazione di illuminazione.
img (Originale)
bg (Sfondo Attenuato)
img_norm (Uscita)
–
Figura 6.25: Simulatore EP06_05: Normalizzazione dello Sfondo per Divisione
%%writefile EP06_05.py
# Codice Python
Overwriting 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.