TNI+VO · Exercice de Programmation

EP04_02 — 📊 Seuillage automatique d’Otsu

4.9.2 EP04_02 📊 Seuillage automatique d’Otsu

Choisir manuellement le seuil \(T\) fonctionne lorsque l’éclairage est stable, mais en microscopie numérique et en inspection de lames de sang, chaque échantillon présente un contraste différent — un seuil fixe échouerait d’une image à l’autre. La méthode d’Otsu résout ce problème en trouvant, de manière autonome, le seuil qui maximise la séparation statistique entre les deux classes de pixels, rendant la segmentation automatique et adaptative. Voir dans Figure 4.31 une simulation de cet EP.

4.9.2.1 📋 Directives d’implémentation

  1. Dimensions : Lire les entiers \(L\) (lignes) et \(C\) (colonnes).

  2. Données : Lire les valeurs entières de la matrice originale ligne par ligne.

  3. Histogramme : Construire l’histogramme \(h[i]\), \(i=0,\dots,255\), en comptant combien de pixels ont la valeur \(i\).

  4. Recherche du seuil : Pour chaque candidat \(T\) de \(1\) à \(255\), calculer la variance inter-classes : \[ \sigma_B^2(T) = \frac{n_0 \cdot n_1}{N^2}\,(m_0 - m_1)^2 \] où \(n_0,n_1\) sont les quantités de pixels ayant une valeur \(<T\) et \(\geq T\), \(m_0,m_1\) sont leurs moyennes, et \(N=L\times C\).

  5. Choix : Le seuil optimal \(T^*\) est celui qui maximise \(\sigma_B^2(T)\) (en cas d’égalité, conserver le premier trouvé).

  6. Application : Binariser l’image en utilisant \(T^*\), en appliquant : \[ p' = \begin{cases} 255, & \text{si } p > T^* \\ 0, & \text{si } p \le T^* \end{cases} \]

4.9.2.2 📌 Contraintes computationnelles

  • Candidats valides : Ignorer \(T\) qui laisse \(n_0=0\) ou \(n_1=0\) (classe vide).
  • Égalité : Toujours conserver le premier \(T\) qui a atteint la valeur maximale de \(\sigma_B^2\).
  • Type : \(T^*\) et la matrice de sortie doivent être des entiers.
  • Convention OpenCV : La binarisation suit cv2.THRESL_BINARY ; les pixels ayant une valeur exactement égale à \(T^*\) deviennent noirs.

4.9.2.3 🧠 Fondements théoriques

Concept Signification Impact
\(\sigma_B^2(T)\) élevée Classes bien séparées en \(T\) \(T\) est un bon candidat comme seuil
Histogramme bimodal Deux « pics » distincts Otsu trouve le creux entre eux
Histogramme unimodal Un seul « pic » Otsu choisit toujours un \(T\), mais la segmentation est peu fiable

4.9.2.4 📦 Spécification d’entrée et de sortie (VPL)

Entrée :

  • Ligne 1 : Entier \(L\).
  • Ligne 2 : Entier \(C\).
  • Lignes suivantes : Éléments entiers de la matrice originale.

Sortie :

  • Matrice binarisée en \(L\) lignes et \(C\) colonnes, valeurs \(0\) ou \(255\).

4.9.2.5 📌 Exemples

Entrée Sortie Observation
4
4
12 12 12 200
12 12 200 200
12 200 200 200
200 200 200 200
0 0 0 255
0 0 255 255
0 255 255 255
255 255 255 255
Histogramme bimodal net : 12 et 200
1
2
10 250
0 250 Deux valeurs seulement : \(T^*\) reste sur la plus grande
📊 Simulateur EP04_02 : Otsu Automatique T* = argmax σ²_B(T)

👆 Clic gauche assombrit (−25) et clic droit éclaircit (+25) les pixels d'entrée. Observez le seuil optimal T* s'ajuster dynamiquement à l'histogramme.

T* = −

Entrée Originale (Cliquable)
Résultat Otsu (p')
Figure 4.31: Simulateur EP04_02 : Seuillage automatique d’Otsu (T* = argmax σ²_B(T))
%%writefile EP04_02.py
# Code Python
Overwriting EP04_02.py
TestSuite("EP04_02.py").run()
✔️ EP04_02.cases existe déjà dans casos/
📋 5 cas chargé(s) depuis casos/EP04_02.cases

🔍 Test de Python : EP04_02.py
⚠️ EP04_02.py : fichier vide (moins de 3 lignes). Tests ignorés.