EDI+VA · Esercizio di Programmazione

EP02_03 — 🎨 Quantizzazione dei Livelli di Grigio

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\).
🎚️ Simulatore EP02_03: Quantizzazione e Profondità di Bit q = round(p · (L − 1) / 255)

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.

8
Livelli discreti (L = 2ᵇ): 256  |  Valori mostrati: 0 a 255
Originale (8 bit → 0…255)
Quantizzata (Intervallo 0…255)
Bit di uscita = 8 → 256 livelli (valori originali preservati)
Figura 2.14: Simulatore EP02_03: Quantizzazione e Profondità di Bit (Riduzione del Numero di Livelli di Grigio)
%%writefile EP02_03.py
# Codice Python
Overwriting 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.