TNI+VO · Exercice de Programmation

EP03_06 — 🌫️ Filtre de moyenne avec kernel N×N

3.12.6 EP03_06 🌫️ Filtre de moyenne avec kernel N×N

Dans les caméras de véhicules autonomes, les images capturées sous la pluie ou le brouillard présentent un bruit gaussien. Le filtre de moyenne est largement utilisé pour sa réduction en temps réel, étant implémenté directement dans le ISP (Image Signal Processor) des capteurs CMOS (Complementary Metal-Oxide-Semiconductor).

Les capteurs CMOS sont les capteurs d’image utilisés dans la plupart des caméras modernes (smartphones, webcams, caméras automobiles, etc.). Ils convertissent la lumière en signaux électriques, et l’ISP traite ces signaux en temps réel — en appliquant des opérations telles que la réduction du bruit, la balance des blancs et d’autres ajustements d’image.

Voir dans Figure 3.31 une simulation de cet EP.

3.12.6.1 📋 Directives d’implémentation

  1. Dimensions : Lire les entiers \(L\) (lignes), \(C\) (colonnes) et \(N\) (taille du kernel, toujours impair).
  2. Données : Lire la matrice de pixels \(f\).
  3. Filtre de moyenne : Pour chaque pixel \((i,j)\) interne (sans bordures), calculer :

\[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. Traitement des bords : Les pixels sur le bord (où la fenêtre \(N \times N\) dépasse les limites) doivent être copiés directement depuis l’original sans modification.
  2. Sortie : Afficher la matrice résultante \(L \times C\).

3.12.6.2 📌 Contraintes de calcul

  • Rayon : \(r = \lfloor N/2 \rfloor\) (moitié du kernel, entier).
  • Pixels internes : \((i,j)\) avec \(r \le i < L-r\) et \(r \le j < C-r\).
  • Arrondi : Utiliser l’arrondi mathématique avant de convertir en entier.
  • Sans clipping : La moyenne des valeurs \(\in [0,255]\) reste dans \([0,255]\).

3.12.6.3 🧠 Fondements théoriques

Taille \(N\) Coefficient Pixels dans la fenêtre Effet
3 \(1/9 \approx 0.111\) 9 Lisse
5 \(1/25 = 0.04\) 25 Moyen
7 \(1/49 \approx 0.020\) 49 Fort

3.12.6.4 📦 Spécification d’entrée et de sortie (VPL)

Entrée :

  • Ligne 1 : Entier \(L\).
  • Ligne 2 : Entier \(C\).
  • Ligne 3 : Entier \(N\) (impair, \(N \ge 3\)).
  • Lignes suivantes : Éléments de la matrice originale.

Sortie :

  • Matrice filtrée \(L \times C\).

3.12.6.5 📌 Exemples

Entrée Sortie Observation
3
3
3
10 20 30
40 50 60
70 80 90
10 20 30
40 50 60
70 80 90
Bordure uniquement (3×3 = bordure 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 isolé : tous les 9 pixels internes dont la fenêtre 3×3 inclut la valeur 100 reçoivent round(100/9)=11
🔲 Simulateur EP03_06 : Filtre Moyenne avec Noyau N×N g = Moyenne(Voisins)

Sélectionnez la taille du noyau et survolez les pixels du résultat pour inspecter le voisinage et le calcul de la moyenne arithmétique.

Taille du noyau :
Image originale f (7×7) Avec bruit sel et poivre
Résultat g (Filtre Lissé) Survolez pour inspecter
Légende :
Fenêtre du Noyau
Bord (Copié)
Pixel Inspecté
Survolez un pixel interne du résultat pour voir le calcul de la moyenne.
Figure 3.31: Simulateur EP03_06: Filtre de Moyenne avec Noyau N×N
%%writefile EP03_06.cpp
// your solution
Overwriting EP03_06.cpp
TestSuite("EP03_06.cpp").run()
✔️ EP03_06.cases existe déjà dans casos/
📋 5 cas chargé(s) depuis casos/EP03_06.cases

🔍 Test de C++ : EP03_06.cpp
⚠️ EP03_06.cpp : fichier vide (moins de 3 lignes). Tests ignorés.