TNI+VO · Exercice de Programmation

EP04_08 — 🌋 Gradient morphologique, Top-hat et Black-hat

4.9.8 EP04_08 🌋 Gradient morphologique, Top-hat et Black-hat

En inspection automatique de plaques de circuits, trois questions reviennent constamment : où se trouvent les bords des composants ? Quels détails clairs et petits (comme les points de soudure) se détachent du fond ? Quelles cavités sombres (comme les fissures) le fond dissimule-t-il ? Une seule paire érosion/dilatation répond aux trois : le gradient morphologique met en évidence les contours, le top-hat révèle les pics étroits, et le black-hat révèle les vallées étroites — trois outils, un seul voisinage. Voir dans Figure 4.37 une simulation de cet EP.

4.9.8.1 📋 Directives d’implémentation

  1. Dimensions de l’image : Lire les entiers \(L\) (lignes) et \(C\) (colonnes) de \(f\).
  2. Dimensions de \(B\) : Lire les entiers \(L_B\) (lignes) et \(C_B\) (colonnes) de l’élément structurant.
  3. Élément structurant : Lire la matrice \(B\) avec des valeurs \(0\) ou \(1\), ligne par ligne.
  4. Données : Lire la matrice \(f\) (l’image originale, en niveaux de gris), ligne par ligne.
  5. Opérateurs de base : Calculer, exactement comme dans les EP 04_03 à 04_06 :
    • \(d = f \oplus B\) (dilatation),
    • \(e = f \ominus B\) (érosion),
    • \(\text{ouverture} = e \oplus B\),
    • \(\text{fermeture} = d \ominus B\).
  6. Gradient morphologique : \(\text{grad}(y,x) = d(y,x) - e(y,x)\).
  7. Top-hat : \(\text{tophat}(y,x) = f(y,x) - \text{ouverture}(y,x)\).
  8. Black-hat : \(\text{blackhat}(y,x) = \text{fermeture}(y,x) - f(y,x)\).
  9. Sortie : Afficher, dans cet ordre, les trois matrices complètes : gradient, top-hat, black-hat.

4.9.8.2 📌 Contraintes computationnelles

  • Sans padding à aucune étape intermédiaire — dilatation, érosion, ouverture et fermeture suivent les mêmes règles de voisinage que les EP précédents.
  • Pas de clipping : les trois sorties peuvent contenir n’importe quelle valeur entière (le gradient est toujours \(\geq 0\), mais top-hat et black-hat le sont aussi).
  • Réutilisation : \(d\) et \(e\) doivent être calculés une seule fois et réutilisés pour construire ouverture, fermeture et gradient.

4.9.8.3 🧠 Fondements théoriques

Opérateur Formule Ce qu’il révèle
Gradient \(d - e\) Bords : zéro dans les régions planes, élevé aux transitions
Top-hat \(f - \text{ouverture}(f)\) Éléments clairs et fins, plus petits que \(B\)
Black-hat \(\text{fermeture}(f) - f\) Éléments sombres et fins, plus petits que \(B\)

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

Entrée :

  • Ligne 1 : Entier \(L\).
  • Ligne 2 : Entier \(C\).
  • Ligne 3 : Entier \(L_B\).
  • Ligne 4 : Entier \(C_B\).
  • Lignes suivantes \(L_B\) : éléments entiers (\(0\) ou \(1\)) de la matrice \(B\).
  • Lignes suivantes \(L\) : éléments entiers de la matrice \(f\).

Sortie :

  • Matrice gradient en \(L\) lignes et \(C\) colonnes.
  • Matrice top-hat en \(L\) lignes et \(C\) colonnes.
  • Matrice black-hat en \(L\) lignes et \(C\) colonnes.

4.9.8.5 📌 Exemples

Entrée Sortie Observation
9
9
3
3
1 1 1
1 1 1
1 1 1
10 10 10 10 10 10 10 10 10
10 10 10 10 10 10 10 10 10
10 10 80 10 10 10 10 10 10
10 10 10 10 10 10 10 10 10
10 10 10 10 10 10 10 10 10
10 10 10 10 10 10 10 10 10
10 10 10 10 10 10 2 10 10
10 10 10 10 10 10 10 10 10
10 10 10 10 10 10 10 10 10
(gradient : halo \(3\times3=70\) autour de \((2,2)\) et halo \(3\times3=8\) autour de \((6,6)\), reste \(0\))
(top-hat : unique \(70\) en \((2,2)\), reste \(0\))
(black-hat : unique \(8\) en \((6,6)\), reste \(0\))
Pic isolé devient top-hat ; vallée isolée devient black-hat ; les deux apparaissent dans le gradient
🌋 Simulateur EP04_08 : Gradient / Top-hat / Black-hat 3 opérateurs, 1 voisinage

Ajoutez des pics ou des creux dans la matrice f et observez le comportement simultané des opérateurs de gradient, top-hat et black-hat.

f (Entrée)
Gradient
Top-hat
Black-hat
Figure 4.37: Simulateur EP04_08: Gradient morphologique, Top-hat et Black-hat
%%writefile EP04_08.cpp
// your solution
Overwriting EP04_08.cpp
TestSuite("EP04_08.cpp").run()
✔️ EP04_08.cases existe déjà dans casos/
📋 4 cas chargé(s) depuis casos/EP04_08.cases

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