| id | aire | périmètre | cx | cy | x | y | w | h | circularité | solidité | sommets |
|---|
8.14.7 EP08_07 🟡 Suppression du Bruit Sel et Poivre et Mesure d’Objets
Dans cet exercice, vous appliquerez un filtrage morphologique pour nettoyer une image binaire corrompue par un bruit de type sel et poivre (pixels isolés de valeur 1 dans le fond et 0 à l’intérieur des objets). Après le nettoyage, le programme doit extraire les mesures géométriques des composants connectés restants, les trier et afficher le tableau final de métriques.
8.14.7.1 📋 Directives d’Implémentation
Entrée : lire deux entiers \(H\) et \(W\) (hauteur et largeur de l’image) sur la première ligne, puis les \(H\) lignes avec la matrice binaire contenant des pixels
0et1séparés par des espaces.Filtrage Morphologique : appliquer un enchaînement d’Ouverture (pour éliminer le bruit de sel dans le fond) suivi d’une Fermeture (pour combler le bruit de poivre à l’intérieur des objets) avec un élément structurant \(3 \times 3\).
Affichage de l’Image Nettoyée : imprimer la matrice résultante en valeurs
0et1séparées par des espaces.Mesures Géométriques : pour chaque objet identifié dans la matrice nettoyée, extraire :
id: identifiant numérique séquentiel (réattribué après le tri) ;area: aire calculée via le contour (cv2.contourArea) ;perimeter: périmètre du contour (cv2.arcLength) ;cx,cy: centre de masse (centroïde viacv2.moments) ;x,y,w,h: coordonnées du rectangle englobant (cv2.boundingRect) ;circularity: circularité donnée par \(\frac{4 \pi \cdot \text{aire}}{\text{périmètre}^2}\) ;solidity: solidité donnée par le rapport \(\frac{\text{aire}}{\text{aire de l'enveloppe convexe}}\) ;vertices: nombre de sommets approximé du polygone (cv2.approxPolyDPavec \(\epsilon = 0.02 \times \text{périmètre}\)).
- Tri et Sortie : trier les objets par ordre croissant selon la position \(X\) du rectangle englobant (
bbox[0]) ; en cas d’égalité, utiliser la position \(Y\) (bbox[1]). Réattribuer lesids de \(1\) à \(N\) et imprimer le tableau formaté.- Pour trier, utiliser
medidas.sort(key=lambda m: (m['bbox'][1], m['bbox'][0])), avecmedidas = mm.measure(img).
- Pour trier, utiliser
8.14.7.2 📌 Contraintes et Règles de Tri
- Règle de Tri des Objets :
medidas.sort(key=lambda m: (m['bbox'][0], m['bbox'][1]))- Différence d’Aire : L’aire calculée par OpenCV (
cv2.contourArea) mesure l’aire du polygone continu délimité par les centres des pixels de bordure, ce qui donne des valeurs numériques inférieures au simple comptage discret des pixels1(np.sum).
8.14.7.3 🧠 Fondements Théoriques
| Opération / Métrique | Fonction dans le Filtrage et la Caractérisation |
|---|---|
| Ouverture Morphologique (\(\circ\)) | Érosion suivie d’une dilatation : supprime les bruits brillants isolés (sel). |
| Fermeture Morphologique (\(\bullet\)) | Dilatation suivie d’une érosion : comble les petits trous sombres à l’intérieur des objets (poivre). |
cv2.boundingRect |
Retourne \((x, y, w, h)\), le plus petit rectangle aligné sur les axes qui englobe l’objet. |
| Circularité et Solidité | Décrivent la compacité et la convexité géométrique du composant. |
8.14.7.4 📌 Exemples
| Entrée | Sortie |
|---|---|
| 8 9 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 |
id area perimeter cx cy x y w h circularity solidity vertices 1 9.0 12.0 3.5 2.0 3 1 4 3 0.79 1.000 4 2 4.0 8.0 7.5 5.5 7 5 2 2 0.79 1.000 4 |
%%writefile EP08_07.py
# Code PythonOverwriting EP08_07.py
TestSuite("EP08_07.py").run()✔️ EP08_07.cases existe déjà dans casos/
📋 4 cas chargé(s) depuis casos/EP08_07.cases
🔍 Test de Python : EP08_07.py
⚠️ EP08_07.py : fichier vide (moins de 3 lignes). Tests ignorés.