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.
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
- Dimensions de l’image : Lire les entiers \(L\) (lignes) et \(C\) (colonnes) de \(f\).
- Dimensions de \(B\) : Lire les entiers \(L_B\) (lignes) et \(C_B\) (colonnes) de l’élément structurant.
- Élément structurant : Lire la matrice \(B\) avec des valeurs \(0\) ou \(1\), ligne par ligne.
- Données : Lire la matrice \(f\) (l’image originale), ligne par ligne.
- 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 |
%%writefile EP04_04.cpp
// your solutionOverwriting 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.