Seuillage d'une image
Fondamental :
Le seuillage d'image est la méthode la plus simple de segmentation d'image. À partir d'une image en niveau de gris, le seuillage d'image peut être utilisé pour créer une image comportant uniquement deux valeurs, noir ou blanc (monochrome)1.
Le seuillage d'image remplace un à un les pixels d'une image à l'aide d'une valeur seuil fixée (par exemple 123). Ainsi, si un pixel à une valeur supérieure au seuil (par exemple 150), il prendra la valeur 255 (blanc), et si sa valeur est inférieure (par exemple 100), il prendra la valeur 0 (noir).
Méthode :
La valeur du seuil peut être déterminée manuellement ou bien automatiquement à partir de l'histogramme.
Méthode : Seuilage en scilab
La valeur du seuil est fixée arbitrairement à 128 :
scicv_Init();
f = scf();
toolbar(f.figure_id, "off");
img = imread("c:/temp/fruits.jpg");
imgnb=cvtColor(img,CV_BGR2GRAY);
subplot(2, 1, 1);
matplot(img);
title("image");
[thresh imgbin]=threshold(imgnb,170,255,THRESH_BINARY);
subplot(2, 1, 2);
matplot(imgbin);
title("image binaire");
delete_Mat(img);
delete_Mat(imgnb);
On peut appliquer la méthode d'Otsu :
scicv_Init();
f = scf();
toolbar(f.figure_id, "off");
img = imread("c:/temp/ocv_haribo.png");
imgnb=cvtColor(img,CV_BGR2GRAY);
subplot(3, 1, 1);
matplot(img);
title("image");
[thresh imgbin]=threshold(imgnb,128,255,THRESH_BINARY);
subplot(3, 1, 2);
matplot(imgbin);
title("image binaire");
[thresh imgbin2]=threshold(imgnb,128,255,THRESH_OTSU);
subplot(3, 1, 3);
matplot(imgbin2);
title("image binaire OTSU");
delete_Mat(img);
delete_Mat(imgnb);
Méthode : Seuillage ne python
Dans ce programme, la valeur du seuil est fixée manuellement par l'utilisateur à l'aide d'une glissière
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
def seuillage(value):
global imgbin
print (value)
ret,imgbin = cv.threshold(img,value,255,cv.THRESH_BINARY)
img = cv.imread('c:/temp/fruits.jpg',cv.IMREAD_GRAYSCALE)
fenetre = 'Image binaire'
cv.namedWindow(fenetre)
# create trackbars for color change
cv.createTrackbar('Thresh',fenetre,0,255,seuillage)
seuillage(0)
while(True):
cv.imshow(fenetre,imgbin)
k = cv.waitKey(1) & 0xFF
if k == 27:
break
cv.destroyAllWindows()
Méthode : Détermination automatique de la valeur du seuil
La méthode d'OTSU permet de déterminer automatiquement la valeur du seuil en maximisant la variance intraclasse.
import numpy as np
import cv2 as cv
img = cv.imread('c:/temp/ocv_haribo.png',cv.IMREAD_GRAYSCALE)
fenetre = 'Image binaire OTSU'
cv.namedWindow(fenetre)
thresh,imgbin=cv.threshold(img,0,255,cv.THRESH_OTSU)
cv.imshow(fenetre,imgbin)
print( 'Valeur seuil OTSU ', thresh)
cv.waitKey(0)
cv.destroyAllWindows()