Regola il fattore di guadagno k, osserva l'intero pipeline di miglioramento (sfocatura, maschera ad alta frequenza) e passa il mouse sul risultato.
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
- Dimensioni: Leggere gli interi \(L\) (righe) e \(C\) (colonne).
- Parametro: Leggere il valore reale \(k\) (intensità del miglioramento, \(k \ge 0\)).
- Dati: Leggere la matrice di pixel \(f\).
- 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)\]
- Maschera ad alta frequenza: \(m(i,j) = f(i,j) - \bar{f}(i,j)\).
- 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)\]
- Bordo: \(g(i,j) = f(i,j)\) (copia diretta).
- Output: Visualizzare la matrice migliorata \(L \times C\).
3.12.10.2 📌 Vincoli Computazionali
- Arrotondamento: Applicare
roundprima 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
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.
%%writefile EP03_10.cpp
// your solutionOverwriting 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.