Cliquez sur les cellules pour dessiner votre propre objet ou sélectionnez une forme prédéfinie pour calculer la carte des distances en cascade.
4.9.9 EP04_09 🗺️ Transformée de distance et le « cœur » de l’objet
En robotique mobile, lors de la planification d’un itinéraire dans un couloir, le robot souhaite savoir non seulement où se trouve l’espace libre, mais aussi à quelle distance chaque point libre se trouve du mur le plus proche. Les chemins les plus sûrs tendent à passer par le « cœur » du couloir, loin des obstacles.
La transformée de distance morphologique attribue à chaque pixel une valeur représentant sa distance jusqu’au bord le plus proche, selon la métrique définie par l’élément structurant. Les pixels proches du bord reçoivent des valeurs faibles, tandis que les pixels plus internes reçoivent des valeurs plus élevées. Le pixel de valeur maximale correspond à la région la plus protégée de l’objet, souvent associée à son centre morphologique.
Voir dans Figure 4.38 une simulation de cet EP.
4.9.9.1 📋 Directives d’implémentation
- Dimensions de l’image : lire les entiers \(L\) (lignes) et \(C\) (colonnes) de l’image \(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\), contenant la valeur \(0\) au centre et des valeurs négatives aux autres positions.
- Image : lire la matrice binaire \(f\) (valeurs \(0\) ou \(1\)), ligne par ligne.
- Préparation : multiplier l’image par \(L\times C\), en garantissant que les pixels internes ont une valeur initiale suffisamment élevée pour la propagation des distances.
- Transformée de distance : calculer la matrice des distances en utilisant la méthode
mm::dist1(f,b). - Sortie : afficher la matrice résultante de la transformée de distance.
4.9.9.2 📌 Contraintes de calcul
- Utiliser l’implémentation de l’érosion pondérée fournie par la bibliothèque.
- L’élément structurant peut contenir des valeurs négatives arbitraires.
- La transformée doit être obtenue par l’application itérative d’érosions pondérées jusqu’à atteindre un point fixe.
⚠️ Note cruciale sur la lecture des matrices : Comme l’élément structurant peut contenir des entiers négatifs (par exemple, -1 et -99), ne pas utiliser la fonction mm::readImg pour lire la matrice \(b\). Cette fonction convertit les données en type uint8, provoquant un underflow et corrompant les valeurs négatives. Lire les \(L_B\) lignes de \(b\) manuellement en utilisant le type standard int. L’image \(f\) peut continuer à être lue normalement par mm::readImg.
4.9.9.3 🧠 Fondement théorique
| Concept | Signification | Impact visuel |
|---|---|---|
| \(\text{dist}(y,x)\) | Distance morphologique jusqu’au bord le plus proche selon la métrique définie par \(b\) | Les pixels plus internes reçoivent des valeurs plus élevées |
| Valeur maximale | Pixel le plus éloigné du bord | Se rapproche du centre morphologique de l’objet |
| Élément structurant pondéré | Définit les coûts de déplacement entre pixels voisins | Détermine la métrique de distance utilisée |
| Objets fins | Régions étroites de l’objet | Produisent des valeurs de distance faibles |
4.9.9.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 de la matrice \(b\).
- Les \(L\) lignes suivantes : éléments binaires (\(0\) ou \(1\)) de la matrice \(f\).
⚠️ Note d’implémentation : Les éléments de la matrice \(f\) (0 ou 1) doivent être multipliés par 255 pour générer une image binaire appropriée (\(0\) et \(255\)) avant d’appliquer la Transformée de Distance (TD).
Sortie :
- Matrice de la transformée de distance en \(L\) lignes et \(C\) colonnes.
4.9.9.5 📌 Exemple
| Entrée | Sortie | Observation |
|---|---|---|
| 5 9 3 3 -99 -1 -99 -1 0 -1 -99 -1 -99 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 |
0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 1 2 2 2 2 2 1 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 |
Résultat de la transformée de distance. |
Note : la valeur -99 agit comme une approximation pratique de \(-\infty\), empêchant la propagation par les diagonales. Ainsi, seuls les voisins horizontaux et verticaux contribuent à la distance, produisant la distance de Manhattan.
%%writefile EP04_09.cpp
// your solutionOverwriting EP04_09.cpp
TestSuite("EP04_09.cpp").run()✔️ EP04_09.cases existe déjà dans casos/
📋 4 cas chargé(s) depuis casos/EP04_09.cases
🔍 Test de C++ : EP04_09.cpp
⚠️ EP04_09.cpp : fichier vide (moins de 3 lignes). Tests ignorés.