EDI+VA · Esercizio di Programmazione

EP03_10 — ✨ Unsharp Masking (USM)

3.12.10 EP03_10 ✨ Unsharp Masking (USM)

Nei sistemi di digitalizzazione di documenti storici e opere d’arte, la nitidezza delle immagini è fondamentale per la lettura di testi manoscritti e dettagli ornamentali. Lo Unsharp Masking (USM) è l’algoritmo di miglioramento della nitidezza standard utilizzato negli scanner professionali e in software come Adobe Photoshop, controllato dal parametro \(k\) che determina l’intensità del miglioramento.

Vedi in Figura 3.35 una simulazione di questo EP.

3.12.10.1 📋 Linee Guida di Implementazione

  1. Dimensioni: Leggere gli interi \(L\) (righe) e \(C\) (colonne).
  2. Parametro: Leggere il valore reale \(k\) (intensità del miglioramento, \(k \ge 0\)).
  3. Dati: Leggere la matrice di pixel \(f\).
  4. Smussamento: Calcolare \(\bar{f}\) con filtro di media \(3\times3\) (solo pixel interni; bordi mantenuti):

\[\bar{f}(i,j) = \frac{1}{9} \sum_{s=-1}^{1} \sum_{t=-1}^{1} f(i+s, j+t)\]

  1. Maschera ad alta frequenza: \(m(i,j) = f(i,j) - \bar{f}(i,j)\).
  2. Miglioramento USM: Per ogni pixel interno:

\[g(i,j) = \text{clip}\left(\text{round}\left(f(i,j) + k \cdot m(i,j)\right)\right)\]

  1. Bordo: \(g(i,j) = f(i,j)\) (copia diretta).
  2. Output: Visualizzare la matrice migliorata \(L \times C\).

3.12.10.2 📌 Vincoli Computazionali

  • Arrotondamento: Applicare round prima del clipping.
  • Saturazione: \(\text{clip}(x) = \max(0, \min(255, x))\).
  • Operazioni in virgola mobile: Calcolare \(\bar{f}\) e \(m\) in virgola mobile prima di arrotondare il risultato finale.
  • \(k = 0\): Nessun miglioramento — l’output è identico all’input (eccetto per i bordi).

3.12.10.3 🧠 Fondamento Teorico

Fase Operazione Descrizione
1 \(\bar{f} = f * \frac{1}{9}\mathbf{1}_{3\times3}\) Smussamento (basse frequenze)
2 \(m = f - \bar{f}\) Maschera (alte frequenze)
3 \(g = \text{clip}(\text{round}(f + k \cdot m))\) Miglioramento ponderato

3.12.10.4 📦 Specifica di Input e Output (VPL)

Input:

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

Output:

  • Matrice migliorata \(L \times C\).

3.12.10.5 📌 Esempi

Input Output Osservazione
3
3
0.0
100 100 100
100 100 100
100 100 100
100 100 100
100 100 100
100 100 100
k=0: nessun miglioramento
3
3
1.0
50 50 50
50 200 50
50 50 50
50 50 50
50 255 50
50 50 50
k=1: pixel centrale migliorato e saturato
✨ Simulatore EP03_10: Unsharp Masking (USM) g = f + k · m

Regola il fattore di guadagno k, osserva l'intero pipeline di miglioramento (sfocatura, maschera ad alta frequenza) e passa il mouse sul risultato.

Fattore di guadagno k: k = 1.0
① Immagine Originale f Matrice 5×5 pixel
② Sfocato f̄ Media 3×3
③ Maschera m m = f − f̄ (Alte Frequenze)
④ Risultato g = f + 1.0·m Passa il mouse per ispezionare
Legenda:
Vicinanza 3×3
Pixel Centrale
Bordo (Copiato)
Maschera Positiva/Negativa
Passa il mouse su un pixel interno del risultato per tracciare l'intero pipeline.
Figura 3.35: Simulatore EP03_10: Unsharp Masking (USM)
%%writefile EP03_10.cpp
// your solution
Overwriting EP03_10.cpp
TestSuite("EP03_10.cpp").run()
✔️ EP03_10.cases esiste già in casos/
📋 5 caso/i caricato/i da casos/EP03_10.cases

🔍 Test di C++: EP03_10.cpp
⚠️ EP03_10.cpp: file vuoto (meno di 3 righe). Test saltati.