TNI+VO · Exercice de Programmation

EP04_03 — 🌱 Dilatation binaire plane (mm.dil0)

4.9.3 EP04_03 🌱 Dilatation binaire plane (mm.dil0)

En microscopie de particules et en OCR de plaques d’immatriculation usées, les traits fins ou discontinus doivent être « épaissis » pour que la reconnaissance fonctionne. La dilatation morphologique fait exactement cela : elle étend les régions claires à l’aide d’un élément structurant \(B\) — la même opération implémentée dans morph.py comme mm.dil0(f, B), utilisée lorsque \(B\) est plat (sans poids, uniquement \(0\)/\(1\)). Voir dans Figure 4.32 une simulation de cet EP.

4.9.3.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), ligne par ligne.
  5. Réflexion : Construire \(B_{ref}\), la version de \(B\) réfléchie à \(180°\) (lignes et colonnes inversées) — exactement comme le fait mm.dil0 en interne.
  6. Voisinage sans padding : Pour chaque pixel \((y,x)\), parcourir les positions \((by,bx)\) de \(B_{ref}\) centrées en \((y,x)\), en utilisant le décalage \[ v_y = y + by + o_y,\quad v_x = x + bx + o_x,\quad o_y=-\tfrac{L_B}{2}+0{,}5,\quad o_x=-\tfrac{C_B}{2}+0{,}5 \] Écarter tout \((v_y,v_x)\) hors de \([0,L)\times[0,C)\) — ne pas remplir avec des zéros.
  7. Mappage : Calculer chaque pixel de sortie comme le maximum entre \(f(y,x)\) et tous les \(f(v_y,v_x)\) valides dont la position correspondante dans \(B_{ref}\) vaut \(1\) : \[ g(y,x) = \max\Big(f(y,x),\ \max_{\substack{(v_y,v_x)\ \text{valide}\\ B_{ref}(by,bx)=1}} f(v_y,v_x)\Big) \]
  8. Sortie : Afficher la matrice \(g\) avec les dimensions \(L \times C\).

4.9.3.2 📌 Contraintes computationnelles

  • Sans padding : Ne jamais inventer de voisins hors de l’image ; n’utiliser que ceux qui existent réellement.
  • Réflexion obligatoire : \(B\) doit être réfléchi avant d’être appliqué (c’est ce qui distingue mm.dil0 d’une simple recherche de maximum).
  • Robustesse des bords : Si aucune position valide de \(B_{ref}=1\) ne tombe dans le domaine pour un pixel donné, celui-ci conserve sa valeur originale.

4.9.3.3 🧠 Fondement théorique

Concept Signification Impact visuel
Dilatation \(g \geq f\) toujours (extensive) Les régions claires croissent, les trous sombres rétrécissent
\(B\) plus grand Voisinage plus large Croissance plus agressive
Réflexion de \(B\) \(B_{ref}(y,x) = B(-y,-x)\) Garantit la définition formelle de Minkowski de la dilatation

4.9.3.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\).
  • Les \(L_B\) lignes suivantes : éléments entiers (\(0\) ou \(1\)) de la matrice \(B\).
  • Les \(L\) lignes suivantes : éléments entiers de la matrice \(f\).

Sortie :

  • Matrice \(g\) en \(L\) lignes et \(C\) colonnes, valeurs entières séparées par des espaces.

4.9.3.5 📌 Exemples

Entrée Sortie Observation
3
3
3
3
0 1 0
1 1 1
0 1 0
0 0 0
0 9 0
0 0 0
0 9 0
9 9 9
0 9 0
\(B\) en croix symétrique : point isolé se dilate en croix
1
4
1
3
1 1 1
10 200 5 80
200 200 200 80 \(B\) horizontal : chaque pixel « attire » le maximum des voisins de la ligne
🌱 Simulateur EP04_03 : Dilatation plane (mm.dil0) g = f ⊕ B

Alternez l'élément structurant B (ou sélectionnez les préréglages) et cliquez sur les cellules de l'image originale f pour allumer ou éteindre les pixels.

Élément structurant B (Cliquez pour basculer 0/1)
Image originale f (5×5)
Dilatée g (f ⊕ B)
 
g(y,x) = max sur les voisins valides de B réfléchi
Figure 4.32: Simulateur EP04_03 : Dilatation binaire plane (g = f ⊕ B)
%%writefile EP04_03.py
# Code Python
Overwriting EP04_03.py
TestSuite("EP04_03.py").run()
✔️ EP04_03.cases existe déjà dans casos/
📋 5 cas chargé(s) depuis casos/EP04_03.cases

🔍 Test de Python : EP04_03.py
⚠️ EP04_03.py : fichier vide (moins de 3 lignes). Tests ignorés.