Le processus suivant est fondé sur l'article :
N. Otsu, A threshold selection method from grey scale histogram,
IEEE Trans. on Syst. Man and Cyber., vol 1, pp 62-66, 1979
Le but de cet algorithme est la binarisation d'images à niveaux
de gris. Ceci revient à séparer les pixels de l'images en
deux classes, la première ayant un niveau maximal (typiquement 255)
et la seconde un niveau minimal (0).
Cette méthode de binarisation nécessite au préalable
le calcul de l'histogramme. Puis, la séparation en deux classes
est effectuée. On peut noter d'ores et déjà qu'il
est assez simple d'étendre ce qui va suivre à un nombre de
classes plus important.
Le calcul de l'histogramme est très simple.
On initialise un tableau histo avec des 0. Généralement,
ce tableau est constitué de 255 cases correspondant aux 255 niveaux
de gris d'une image.
Ensuite, si p(i,j) représente la valeur du pixel au point (i,j),
on balaye toute l'image et on compte le nombre de fois ou un niveau de
gris apparait.
D'après l'article, la séparation se fait à partir
des moments des deux premiers ordres : la moyenne et l'écart-type.
Pour que le procédé soit indépendant du nombre de
points dans l'image N, on normaliser l'histogramme : pi = ni/N
ou ni représente le nombre de pixels de niveau i. On
peut calculer alors les 2 moments utilisés : mu(k) = sum(i=1,k)
i*pi w(k) = sum(i=1,k) pi l'expression sum(i=1,k)
représente la somme de i=1 à k.
On note muT=mu(256), où 256 est le nombre totale de niveaux
de gris.
Si on appelle w0 la probabilité de la classe C0
et w1 la probabilité de la classe C1, alors
:
w0 = w(k*) où k* représente le niveau de seuil
et w0 = 1 - w(k*).
Si on note de même mu1 et mu0 avec : mu0
= mu(k*)/w(k*) mu1 = (muT-mu(k*))/(1-w(k)) Or l'image
totale conserve certaines propriétés, d'où on peut
tirer les relations : w0mu0+w1mu1=muT
w0+w1=1 En introduisant un paramètre pour
évaluer la qualité du niveau de seuillage, on obtient : s2=w0w1(mu1-mu0)2.
La valeur précédente est fonction de k. On calcule
donc cette valeur pour les 256 niveaux de gris de l'image. (en fait on
peut déjà enlever les valeurs 0 et 255 qui correspondent
à affecter tous les pixels à la même classe).
A partir de w(k) et mu(k), on calcule donc : s2(k)=w(k)(1-w(k))(muTw(k)-mu(k))2
(NB : il y a une erreur dans l'article à ce niveau).
la valeur du seuil k* est obtenue pour le maximum de s2.
Il ne reste plus qu'à comparer la valeur de tous les pixels de l'images au seuil ainsi trouvé.