Binarisation d'images à niveaux de gris par la méthode d'Otsu

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
 

Introduction

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.
 
 

Calcul de l'histogramme

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.
 

Séparation en 2 classes

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é.

résultats