Regola il numero di bit di uscita (b) per osservare la mappatura dei 256 livelli continui di grigio su L = 2ᵇ livelli discreti di quantizzazione.
2.12.3 EP02_03 🎨 Quantizzazione dei Livelli di Grigio
In questa attività, devi implementare la quantizzazione uniforme di un’immagine, riducendo il numero di livelli di intensità di grigio originali a una nuova scala basata su un numero inferiore di bit.
- Leggi due interi L e C, che rappresentano le dimensioni della matrice.
- Leggi un intero \(k\) (\(1 \le k \le 8\)), che rappresenta il nuovo numero di bit dell’immagine.
- Calcola il numero di livelli (\(N = 2^k\)) e la dimensione dell’intervallo (passo).
- Per ogni pixel \(p\), calcola il nuovo valore \(p'\) mappandolo all’indice del livello discretizzato corrispondente (variabile da \(0\) a \(2^k-1\)).
- Stampa la matrice risultante con gli stessi valori delle dimensioni originali.
- Vedi in Figura 2.14 una simulazione di questo EP.
📌 Importante:
- Posterizzazione: Riducendo drasticamente i livelli (es: \(k=2\)), noterai che le sfumature morbide si trasformano in bande cromatiche nette a causa della perdita di risoluzione dell’ampiezza.
- Calcolo del Passo: L’intervallo tra ogni livello è definito da \(passo = 256 / 2^k\).
- Mappatura: Il metodo di quantizzazione uniforme per troncamento che mappa il pixel all’indice del rispettivo livello discretizzato è dato da:
\[p' = \left\lfloor \frac{p}{passo} \right\rfloor\]
In termini di implementazione (come in Python), ciò equivale alla divisione intera: p' = p // passo.
2.12.3.1 🧠 Discretizzazione dell’Ampiezza
Mentre il sottocampionamento gestisce la risoluzione spaziale, la quantizzazione si concentra sulla precisione del colore (ampiezza). Ridurre i bit significa semplificare l’informazione cromatica:
| Parametro | Funzione | Effetto |
|---|---|---|
| Bit (\(k\)) | Profondità di colore | Definisce quanti toni diversi può avere l’immagine (\(2^k\)). |
| Passo | Intervallo di tono | Spaziatura tra i livelli di grigio consentiti. |
| Posterizzazione | Fenomeno visivo | Trasformazione di variazioni continue in blocchi di colore solido. |
2.12.3.2 📋 Compito (specifica per VPL)
Input:
La prima riga contiene L.
La seconda riga contiene C.
La terza riga contiene il numero di bit k.
Le righe seguenti contengono gli elementi della matrice \(L \times C\).
Output:
La matrice trasformata con gli indici dei livelli quantizzati, mantenendo la dimensione originale \(L \times C\).
2.12.3.3 📌 Esempi
| Input | Output | Osservazione |
|---|---|---|
| 1 4 2 0 80 170 255 |
0 1 2 3 | Con \(k=2\), abbiamo \(2^2=4\) livelli discreti disponibili (\(0,1,2,3\)). Il passo è \(256/4=64\). Applicando la divisione intera per elemento: \(0 // 64 = 0\), \(80 // 64 = 1\), \(170 // 64 = 2\), \(255 // 64 = 3\). |
| 1 5 1 10 50 120 200 250 |
0 0 0 1 1 | Con \(k=1\), abbiamo \(2^1=2\) livelli (\(0\) e \(1\)). Passo \(=256/2=128\). I pixel minori di \(128\) risultano in \(0\), mentre i pixel maggiori o uguali a \(128\) risultano in \(1\). |
%%writefile EP02_03.py
# Codice PythonOverwriting EP02_03.py
TestSuite("EP02_03.py").run()✔️ EP02_03.cases esiste già in casos/
📋 5 caso/i caricato/i da casos/EP02_03.cases
🔍 Test di Python: EP02_03.py
⚠️ EP02_03.py: file vuoto (meno di 3 righe). Test saltati.