TNI+VO · Exercice de Programmation

EP08_07 — 🟡 Suppression du Bruit Sel et Poivre et Mesure d’Objets

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

  1. 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 0 et 1 séparés par des espaces.

  2. 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\).

  3. Affichage de l’Image Nettoyée : imprimer la matrice résultante en valeurs 0 et 1 séparées par des espaces.

  4. 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 via cv2.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.approxPolyDP avec \(\epsilon = 0.02 \times \text{périmètre}\)).
  1. 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 les ids de \(1\) à \(N\) et imprimer le tableau formaté.
    • Pour trier, utiliser medidas.sort(key=lambda m: (m['bbox'][1], m['bbox'][0])), avec medidas = mm.measure(img).

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 pixels 1 (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
🧮 Simulateur EP08_07 : Morphologie Commutable (4-C / 8-C) & Métriques OpenCV Sel + Poivre → Ouverture → Fermeture → Mesure
ÉTAPE DU TRAITEMENT MORPHOLOGIQUE
ÉLÉMENT STRUCTURANT
AFFICHAGE DES PIXELS
VISUALISATION DE LA MATRICE DE PIXELS D'ENTRÉE / TRAITÉE
TABLEAU DES MESURES DES OBJETS (CALCULÉ APRÈS OUVERTURE ET FERMETURE)
id aire périmètre cx cy x y w h circularité solidité sommets
Figure 8.21: Simulateur EP08_07: Morphologie avec Connectivité Configurable et Mesure
%%writefile EP08_07.py
# Code Python
Overwriting 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.