EDI+VA · Esercizio di Programmazione

EP03_06 — 🌫️ Filtro di Media con Kernel N×N

3.12.6 EP03_06 🌫️ Filtro di Media con Kernel N×N

Nelle telecamere dei veicoli autonomi, le immagini acquisite sotto pioggia o nebbia presentano rumore gaussiano. Il filtro di media è ampiamente utilizzato per la sua riduzione in tempo reale, essendo implementato direttamente nell’ISP (Image Signal Processor) dei sensori CMOS (Complementary Metal-Oxide-Semiconductor).

I sensori CMOS sono i sensori di immagine utilizzati nella maggior parte delle fotocamere moderne (smartphone, webcam, fotocamere automobilistiche, ecc.). Essi convertono la luce in segnali elettrici, e l’ISP elabora questi segnali in tempo reale — applicando operazioni come la riduzione del rumore, il bilanciamento del bianco e altre regolazioni dell’immagine.

Vedere in Figura 3.31 una simulazione di questo EP.

3.12.6.1 📋 Linee Guida di Implementazione

  1. Dimensioni: Leggere gli interi \(L\) (righe), \(C\) (colonne) e \(N\) (dimensione del kernel, sempre dispari).
  2. Dati: Leggere la matrice di pixel \(f\).
  3. Filtro di Media: Per ogni pixel \((i,j)\) interno (senza bordi), calcolare:

\[g(i,j) = \text{round}\left(\frac{1}{N^2} \sum_{s=-(r)}^{r} \sum_{t=-(r)}^{r} f(i+s,\, j+t)\right), \quad r = \lfloor N/2 \rfloor\]

  1. Trattamento dei Bordi: I pixel sul bordo (dove la finestra \(N \times N\) supera i limiti) devono essere copiati direttamente dall’originale senza modifiche.
  2. Uscita: Visualizzare la matrice risultante \(L \times C\).

3.12.6.2 📌 Vincoli Computazionali

  • Raggio: \(r = \lfloor N/2 \rfloor\) (metà del kernel, intero).
  • Pixel interni: \((i,j)\) con \(r \le i < L-r\) e \(r \le j < C-r\).
  • Arrotondamento: Usare l’arrotondamento matematico prima di convertire in intero.
  • Senza clipping: La media dei valori \(\in [0,255]\) rimane in \([0,255]\).

3.12.6.3 🧠 Fondamenti Teorici

Dimensione \(N\) Coefficiente Pixel nella finestra Effetto
3 \(1/9 \approx 0.111\) 9 Morbido
5 \(1/25 = 0.04\) 25 Medio
7 \(1/49 \approx 0.020\) 49 Forte

3.12.6.4 📦 Specifica di Input e Output (VPL)

Input:

  • Riga 1: Intero \(L\).
  • Riga 2: Intero \(C\).
  • Riga 3: Intero \(N\) (dispari, \(N \ge 3\)).
  • Righe successive: Elementi della matrice originale.

Output:

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

3.12.6.5 📌 Esempi

Input Output Osservazione
3
3
3
10 20 30
40 50 60
70 80 90
10 20 30
40 50 60
70 80 90
Solo bordo (3×3 = bordo totale)
5
5
3
0 0 0 0 0
0 0 0 0 0
0 0 100 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 11 11 11 0
0 11 11 11 0
0 11 11 11 0
0 0 0 0 0
Pixel isolato: tutti i 9 pixel interni la cui finestra 3×3 include il valore 100 ricevono round(100/9)=11
🔲 Simulatore EP03_06: Filtro Media con Kernel N×N g = Media(Vicini)

Seleziona la dimensione del kernel e passa il mouse sui pixel del risultato per ispezionare il vicinato e il calcolo della media aritmetica.

Dimensione del kernel:
Immagine Originale f (7×7) Con rumore sale e pepe
Risultato g (Filtro Smussato) Passa il mouse per ispezionare
Legenda:
Finestra del Kernel
Bordo (Copiato)
Pixel Ispezionato
Passa il mouse su un pixel interno del risultato per vedere il calcolo della media.
Figura 3.31: Simulatore EP03_06: Filtro Medio con Kernel N×N
%%writefile EP03_06.cpp
// your solution
Overwriting EP03_06.cpp
TestSuite("EP03_06.cpp").run()
✔️ EP03_06.cases esiste già in casos/
📋 5 caso/i caricato/i da casos/EP03_06.cases

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