TNI+VO · Exercice de Programmation

EP05_02 — 🟡 Filtre Notch : Suppression des pics périodiques

5.13.2 EP05_02 🟡 Filtre Notch : Suppression des pics périodiques

Une caméra d’inspection industrielle capture des images de circuits imprimés, mais l’alimentation électrique de la ligne de production introduit une interférence électrique périodique — un motif de stries quasi imperceptible à l’œil nu, mais qui apparaît dans le spectre de Fourier comme des paires de pics brillants symétriquement positionnés autour du centre. L’équipe de vision par ordinateur ne peut pas recapturer l’image : elle doit localiser et effacer chirurgicalement ces paires de pics dans le spectre, tout en préservant le reste de l’information utile de l’image.

C’est le rôle du filtre coupe-bande notch : contrairement au passe-bas (qui affecte une région continue), il cible des points spécifiques et leurs symétriques, laissant le reste du spectre intact.

5.13.2.1 📋 Directives d’implémentation

  1. Dimensions : Lire les entiers \(L\) (lignes) et \(C\) (colonnes) du spectre de magnitude centré.
  2. Données : Lire les valeurs entières de la matrice de magnitude, ligne par ligne.
  3. Pics : Lire l’entier \(K\) (nombre de paires de pics à supprimer).
  4. Pour chacun des \(K\) pics : lire trois entiers \(\Delta v\), \(\Delta u\), \(r\) — déplacement vertical, déplacement horizontal et rayon du notch.
  5. Centre du spectre : \((c_y, c_x) = (L \mathbin{//} 2,\; C \mathbin{//} 2)\).
  6. Suppression symétrique : pour chaque pic, mettre à zéro toutes les positions \((u,v)\) telles que la distance au point \((c_y+\Delta v,\, c_x+\Delta u)\) soit \(\le r\), et également toutes les positions à distance \(\le r\) du point symétrique \((c_y-\Delta v,\, c_x-\Delta u)\).
  7. Sortie : Afficher la matrice résultante avec les dimensions \(L \times C\).

5.13.2.2 📌 Contraintes computationnelles

  • Symétrie obligatoire : chaque pic fourni génère deux disques mis à zéro (le point et son symétrique par rapport au centre) — oublier le symétrique est l’erreur la plus courante.
  • Chevauchement : si deux disques se chevauchent, la position reste à zéro (ni « addition » ni restauration).
  • Comparaison non stricte : une position est mise à zéro si \(\text{distance} \le r\).
  • Ordre de lecture : les \(K\) pics doivent être traités dans l’ordre où ils apparaissent en entrée, mais le résultat final est indépendant de l’ordre (les opérations de mise à zéro sont commutatives).

5.13.2.3 🧠 Fondement théorique

Concept Rôle dans le filtre notch
Pic en \((\Delta v, \Delta u)\) Fréquence de l’interférence périodique détectée visuellement dans le spectre
Point symétrique \((-\Delta v,-\Delta u)\) Toute DFT d’un signal réel est hermitienne : les pics apparaissent toujours en paires symétriques par rapport au centre
Rayon \(r\) Contrôle la « largeur » de la réjection — un \(r\) grand élimine davantage d’énergie autour du pic, mais aussi davantage d’information utile

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

Entrée :

  • Ligne 1 : Entier \(L\).
  • Ligne 2 : Entier \(C\).
  • Lignes suivantes : Éléments entiers de la matrice de magnitude (centrée), \(L\) lignes.
  • Ligne suivante : Entier \(K\).
  • \(K\) lignes suivantes : trois entiers \(\Delta v\), \(\Delta u\), \(r\) (séparés par des espaces).

Sortie :

  • Matrice résultante sur \(L\) lignes et \(C\) colonnes, séparés par des espaces.

5.13.2.5 📌 Exemples

Entrée Sortie Observation
5
5
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
1
1 1 0
1 2 3 4 5
6 0 8 9 10
11 12 13 14 15
16 17 18 0 20
21 22 23 24 25
Centre \((c_y, c_x) = (2, 2)\). Pic fourni \((\Delta v, \Delta u) = (1, 1)\) génère le point \((3, 3)\) (valeur 19) et son symétrique \((1, 1)\) (valeur 7), tous deux mis à zéro avec \(r=0\) (seuls les points exacts).
🎮 Simulateur EP05_02 : Filtre Notch Paire symétrique
1
1
0
Déplacez Δv e Δu pour choisir le pic — observez que la paire symétrique est également filtrée.
Spectre 5×5 (Rouge = Supprimé par le filtre)
–
Figure 5.33: Simulateur EP05_02: Filtre Notch
%%writefile EP05_02.cpp
// your solution
Overwriting EP05_02.cpp
TestSuite("EP05_02.cpp").run()
✔️ EP05_02.cases existe déjà dans casos/
📋 5 cas chargé(s) depuis casos/EP05_02.cases

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