Une des opérations les plus courantes dans le traitement d’image est le prétraitement des images. Différentes étapes peuvent être réalisées pour améliorer l’image afin de faciliter les traitements ultérieurs. Parmi ces étapes, les opérations de seuillage sont régulièrement utilisés afin de pouvoir exploiter l’image plus facilement.
Regarder bien l’image suivante, combien de forme voyez-vous ? La réponse évidente est 3: un rond, un triangle et un carré. Mais en êtes-vous bien sûr ? En fait une dernière étoile se cache dans l’image. Comment la voir ? En faisant un seuillage sur les niveau de gris de cette image.
Mais avant de commencer, un petit rappel sur ce qu’est une image en niveau de gris. Une image est composée de pixels. Chacun de ces pixels a une valeur comprise entre 0 et 255. Plus la valeur est proche de 0, plus le pixel est sombre et inversement, un pixel s’approchant de 255.
Le principe du seuillage est de remplacer un à un les pixels d’une image à l’aide d’une valeur seuil fixée (par exemple 125).
Seuillage binaire
Révélons donc l’étoile dans notre image :
import cv2 img=cv2.imread('image.png',cv2.IMREAD_GRAYSCALE) _, img_seuil = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY) cv2.imshow("image",img_seuil) cv2.waitKey(0)
Qu’avons-nous fait ? grâce à la fonction cv2.threshold() d’OpenCV, nous avons remplacé les pixels dont la valeur est supérieure à 0 à une valeur donnée (255). C’est ce que l’on appelle un seuil binaire (il ne reste que deux valeurs : 0 et 255)
Si img(x,y) > seuil: img_seuil(x,y)=255 Sinon: img_seuil(x,y)=0
Le seuillage permet donc d’effectuer un traitement à une image afin de pouvoir mettre en avant certaines de ses caractéristiques.
Il peut être intéressant dans certaines applications d’obtenir le négatif de cette image, à savoir les formes en noir sur un fond blanc. Pour obtenir ce résultat, il suffit d’appliquer un seuillage binaire inverse
_, img_seuil = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY_INV)
Comme vous pouvez vous en douter ce seuillage produit l’inverse de la méthode précédente
Si img(x,y) > seuil: img_seuil(x,y)=0 Sinon: img_seuil(x,y)=255
Seuillage tronqué
Cette méthode permet d’assigner aux pixels supérieurs à un seuil, la valeur du seuil. Il est à noter que pour ce seuillage, ainsi que pour les suivants, la valeur maximale des pixels seuillés n’est plus utilisée. Il est cependant nécessaire de garder une valeur max pour le fonctionnement de la fonction.
_,img_seuil = cv2.threshold(img, 100, 255, cv2.THRESH_TRUNC)
Si img(x,y) > seuil: img_seuil(x,y)=seuil Sinon: img_seuil(x,y)=0
Ce qui donne le résultat suivant:
Seuillage à zéro
_,img_seuil = cv2.threshold(img, 100, 255, cv2.THRESH_TOZERO)
Cette méthode permet de mettre à zéro tous les pixels en dessous du seuil et de garder les valeurs des pixels supérieurs au seuil.
Si img(x,y) > seuil: img_seuil(x,y)=img(x,y) Sinon: img_seuil(x,y)=0
Bien évidemment l’inverse existe l’inverse: cv2.THRESH_TOZERO_INV
Les artefacts que l’on peut distinguer viennent du fait que les bordures des objets ont une « valeur de transition » entre la couleur de l’objet et le fond. Cette valeur peut alors se retrouver en dessous du seuil sélectionné, rendant les contours moins nets. Certains lecteurs ont été confronté à cette problématique lors de la reconnaissance de formes.
Les méthodes de seuillage sont régulièrement utilisé en traitement de l’image car elles permettent de faciliter l’extraction de caractéristiques, d’objets … Nous avions d’ailleurs utilisé un seuillage binaire pour extraire les dés
0 commentaire