TNI+VO · Exercice de Programmation

EP04_04 — 🪨 Érosion binaire plane (mm.ero0)

4.9.4 EP04_04 🪨 Érosion binaire plane (mm.ero0)

Si la dilatation épaissit, l’érosion affine. Dans les systèmes de comptage de cellules, elle est utilisée pour séparer les cellules qui se touchent : en « mangeant » les bords de chaque région, les connexions fines entre objets disparaissent avant même qu’un comptage soit effectué. Dans morph.py, c’est l’opération mm::ero0(f, B) — le dual exact de la dilatation, et la seule des deux qui ne réfléchit pas l’élément structurant. Voir dans Figure 4.33 une simulation de cet EP.

4.9.4.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. Voisinage sans padding (sans réflexion !) : Pour chaque pixel \((y,x)\), parcourir les positions \((by,bx)\) de \(B\) dans l’ordre original (sans réfléchir), en utilisant le même décalage que dans l’EP04_03 : \[ 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)\). 6. Mappage : Calculer chaque pixel de sortie comme le minimum entre \(f(y,x)\) et tous les \(f(v_y,v_x)\) valides dont la position correspondante dans \(B\) vaut \(1\) : \[ g(y,x) = \min\Big(f(y,x),\ \min_{\substack{(v_y,v_x)\ \text{valide}\\ B(by,bx)=1}} f(v_y,v_x)\Big) \] 7. Sortie : Afficher la matrice \(g\) avec des dimensions \(L \times C\).

4.9.4.2 📌 Contraintes de calcul

  • Sans réflexion : Contrairement à la dilatation, \(B\) est utilisé exactement comme lu — réfléchir ici serait une erreur conceptuelle grave.
  • Sans padding : Les voisins hors de l’image sont simplement ignorés, jamais traités comme \(0\).
  • Robustesse de bord : Si aucune position valide de \(B=1\) ne tombe dans le domaine, le pixel conserve sa valeur originale.

4.9.4.3 🧠 Fondements théoriques

Concept Signification Impact visuel
Érosion \(g \leq f\) toujours (anti-extensive) Les régions claires rétrécissent, le bruit ponctuel disparaît
Dualité \(\text{ero}(f,B) = -\text{dil}(-f, B_{ref})\) Érosion et dilatation sont des « miroirs » mathématiques
\(B\) plus grand Érosion plus agressive Les objets fins disparaissent complètement

4.9.4.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\).
  • \(L_B\) lignes suivantes : éléments entiers (\(0\) ou \(1\)) de la matrice \(B\).
  • \(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.4.5 📌 Exemples

Entrée Sortie Observation
3
3
3
3
0 1 0
1 1 1
0 1 0
9 9 9
9 0 9
9 9 9
9 0 9
0 0 0
9 0 9
Le « trou » central (0) se propage en croix
1
4
1
3
1 1 1
10 200 5 80
10 5 5 80 \(B\) horizontal : chaque pixel « tire » le minimum des voisins de la ligne
🪨 Simulateur EP04_04 : Érosion plane (mm.ero0) 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 des pixels.

Élément structurant B (Cliquer pour alterner 0/1)
Image originale f (5×5)
Érodée g (f ⊖ B)
 
g(y,x) = min sur les voisins valides de B (sans réflexion)
Figure 4.33: Simulateur EP04_04: Érosion Binaire Plane (g = f ⊖ B)
%%writefile EP04_04.cpp
// your solution
Overwriting EP04_04.cpp
TestSuite("EP04_04.cpp").run()
✔️ EP04_04.cases existe déjà dans casos/
📋 5 cas chargé(s) depuis casos/EP04_04.cases

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