Seleziona la dimensione del kernel e passa il mouse sui pixel del risultato per ispezionare il vicinato e il calcolo della media aritmetica.
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
- Dimensioni: Leggere gli interi \(L\) (righe), \(C\) (colonne) e \(N\) (dimensione del kernel, sempre dispari).
- Dati: Leggere la matrice di pixel \(f\).
- 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\]
- Trattamento dei Bordi: I pixel sul bordo (dove la finestra \(N \times N\) supera i limiti) devono essere copiati direttamente dall’originale senza modifiche.
- 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 |
%%writefile EP03_06.cpp
// your solutionOverwriting 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.