Seuillage ou Segmentation d’image avec Opencv-python

Seuillage  ou Segmentation d’image avec Opencv-python

Le seuillage d’image  consiste à remplacer un à un les pixels d’une image à l’aide d’une valeur seuil fixée (par exemple 127). Ainsi, si un pixel à une valeur supérieure au seuil (par exemple 190), il prendra la valeur 255 (blanc), et si sa valeur est inférieure (par exemple 100), il prendra la valeur 0 (noir). On peut dire également que c’est une technique , qui consiste à affecter les valeurs des pixels en fonction de la valeur seuil fournie. Dans le seuillage, chaque valeur de pixel est comparée à la valeur seuil. … Cette technique de seuillage est réalisée sur des images en niveaux de gris.

La valeur du seuil est fixée arbitrairement.

On va donc essayer de voir quelques méthodes de seuillage :

Méthode d’Otsu

La méthode d’Otsu est utilisée pour effectuer un seuillage automatique à partir de la forme de l’histogramme de l’image1, ou la réduction d’une image à niveaux de gris en une image binaire. L’algorithme suppose alors que l’image à binariser ne contient que deux classes de pixels, (c’est-à-dire le premier plan et l’arrière-plan) puis calcule le seuil optimal qui sépare ces deux classes afin que leur variance intra-classe soit minimale2  

threshold est utilisé pour appliquer le seuillage. Le premier argument est l’image source, qui doit être une image en niveaux de gris. Le deuxième argument est la valeur de seuil qui est utilisée pour classer les valeurs de pixel. Le troisième argument est la valeur maximale qui est attribuée aux valeurs de pixels dépassant le seuil.

En termes simples,  le seuillage d’Otsu calcule automatiquement une valeur seuil à partir de l’histogramme d’image pour une image bimodale. (Pour les images qui ne sont pas bimodales, la binarisation ne sera pas précise.)

Image originale:

Voici un exemple de code python :

[pastacode lang=”python” manual=”import%20cv2%0Aimport%20matplotlib.pyplot%20as%20plt%0Afrom%20matplotlib.pyplot%20import%20*%0Aima%3Dcv2.imread(‘%2Fcontent%2Fdrive%2FMyDrive%2FSerie1%2FTournesol_H_noir_IMX145_05-06-2021-01-50-11_.tif’%2Ccv2.COLOR_BGR2RGB)%0A%0Agray%3Dcv2.cvtColor(ima%2C%20cv2.COLOR_BGR2GRAY)%20%23%20convertir%20l’image%20en%20niveau%20de%20gris%0A%0Aret%2C%20thresh_img1%20%3D%20cv2.threshold(gray%2C%20220%2C%20255%2C%20cv2.THRESH_OTSU)%20%23%20seuil%20220-255%0Aret%2C%20thresh_img%20%3D%20cv2.threshold(ima%2C%20127%2C%20255%2C%20cv2.THRESH_BINARY)%20%23%20Seuil%20127-255%0Afigure(figsize%3D(10%2C6))%0Aplt.subplot(331)%2Cimshow(ima)%2C%20plt.title(‘Image%20originale’)%0Aplt.xticks(%5B%5D)%2C%20plt.yticks(%5B%5D)%0Aplt.subplot(332)%2Cimshow(thresh_img1)%0Aplt.xticks(%5B%5D)%2Cplt.yticks(%5B%5D)%2C%20plt.title(‘Radicule%20segment%C3%A9e_220_255’)%0Aplt.subplot(333)%2Cimshow(thresh_img)%2Cplt.title(‘Image%20binaris%C3%A9e’)%0Aplt.xticks(%5B%5D)%2Cplt.yticks(%5B%5D)” message=”Binarisation d’Otsu ou le seuillage d’Otsu” highlight=”” provider=”manual”/]

Seuillage simple ou Segmentation simple

 

Si la valeur du pixel est supérieure à une valeur seuil, une valeur lui est attribuée (peut être blanche), sinon une autre valeur lui est attribuée (peut être noire). La fonction utilisée est cv2.threshold. Le premier argument est l’image source, qui doit être une image en niveaux de gris . Le deuxième argument est la valeur seuil qui est utilisée pour classer les valeurs de pixels. Le troisième argument est la valeur maximale qui représente la valeur à donner si la valeur du pixel est supérieure (parfois inférieure) à la valeur seuil.

OpenCV fournit différents styles de seuillage et il est décidé par le quatrième paramètre de la fonction. Les différents types sont :

  • cv2.THRESH_BINARY
  • cv2.THRESH_BINARY_INV
  • cv2.THRESH_TRUNC
  • cv2.THRESH_TOZERO
  • cv2.THRESH_TOZERO_INV

Voici un code python pour montrer comment on peut appliquer les différents types de seuillage.

[pastacode lang=”python” manual=”import%20cv2%0Aimport%20numpy%20as%20np%0Afrom%20matplotlib%20import%20pyplot%20as%20plt%0A%0Aimg%20%3D%20cv2.imread(‘%2Fcontent%2Fdrive%2FMyDrive%2FSerie1%2FTournesol_H_noir_IMX145_05-06-2021-03-50-13_.tif’%2C0)%0Aret%2Cthresh1%20%3D%20cv2.threshold(img%2C127%2C255%2Ccv2.THRESH_BINARY)%0Aret%2Cthresh2%20%3D%20cv2.threshold(img%2C127%2C255%2Ccv2.THRESH_BINARY_INV)%0Aret%2Cthresh3%20%3D%20cv2.threshold(img%2C127%2C255%2Ccv2.THRESH_TRUNC)%0Aret%2Cthresh4%20%3D%20cv2.threshold(img%2C127%2C255%2Ccv2.THRESH_TOZERO)%0Aret%2Cthresh5%20%3D%20cv2.threshold(img%2C127%2C255%2Ccv2.THRESH_TOZERO_INV)%0A%0Atitles%20%3D%20%5B’Original%20Image’%2C’BINARY’%2C’BINARY_INV’%2C’TRUNC’%2C’TOZERO’%2C’TOZERO_INV’%5D%0Aimages%20%3D%20%5Bimg%2C%20thresh1%2C%20thresh2%2C%20thresh3%2C%20thresh4%2C%20thresh5%5D%0A%0Afor%20i%20in%20range(6)%3A%0A%20%20%20%20plt.subplot(2%2C3%2Ci%2B1)%2Cplt.imshow(images%5Bi%5D%2C’gray’)%0A%20%20%20%20plt.title(titles%5Bi%5D)%0A%20%20%20%20plt.xticks(%5B%5D)%2Cplt.yticks(%5B%5D)%0A%0Aplt.show()” message=”Seuillage simple ou Segmentation simple avec python” highlight=”” provider=”manual”/]

Please follow and like us:
Pin Share

Laisser un commentaire