S'il y a une chose importante en analyse et traitement d'image, c'est bien d'être capable de
Car en effet, si tu es capable de faire cela, non seulement, tu seras capable d'obtenir la position des objets, de les déplacer dans l'image, mais aussi les extraire de l'image et de les mesurer.
Et il faut bien l'avouer être capable d'extraire des objets d'une image et de les mesurer c'est bien utile pour les tâches de reconnaissance d'image non?
Sinon comment serais-tu capable d'obtenir l'aire, le périmètre, aspect ratio des objets d'intérêt présents dans l'image.
Mieux encore comment seras-tu capable d'envoyer cette image en entrée d'un réseau de neurones convolutif?
Sans cela impossible de faire de la reconnaissance, mais également de générer quoi que ce soit !
Car si tu es fan de machine learning et de deep learning comme moi je le suis, tu dois d'hors et déjà t'intéresser au GAN (Generative Adversarial Network) qui font fureur en ce moment même dans le domaine du traitement d'image et du deep learning !
Quoi qu'il en soit, tu l'as compris, dans ce tutoriel je vais te montrer comment détecter les contours d'un objet dans une image et donc comment utiliser la fonction
d'openCV.
Dans cet article, tu trouveras donc :
Comment créer une image binaire et pourquoi il est nécessaire d'en faire une pour obtenir les contours des objets ?
Comment utiliser la fonction findcontours ?
GAN qui transforme la phrase "petit chien blanc mignon" en une vraie image de petit chien
Code :
ret,th=cv2.threshold(img, seuil,couleur, option)
Le premier paramètre est l'image à traiter.
Le second normalement devrait être la valeur du seuil mais étant donné que Otsu décide du seuil automatiquement, cet valeur correspondra à la valeur minimale de seuil que l'on autorise la fonction à retourner.
Le troisième argument est la couleur que prendront les objets de l'image après avoir été seuillé. Le dernier paramètre "option" correspond à la méthode de seuillage que l'on souhaite employer.
Dans notre cas comme j'ai dit que nous allions utiliser la méthode d'Otsu, ce paramètre aura pour valeur,
cv2.THRESH_BINARY+cv2.THRESH_OTSU.
exemple :
ret2,th2 = cv.threshold(img,0,255,cv.THRESH_BINARY+cv.THRESH_OTSU)
Exemple : Application de la méthode d’Otsu sur chaque canal de l’image HSV
import cv2 as cv
import numpy as np
img=cv.imread ("fleur.png");
hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)
h,s,v= cv.split(hsv)
ret_h, th_h = cv.threshold(h,0,255,cv.THRESH_BINARY+cv.THRESH_OTSU)
ret_s, th_s = cv.threshold(s,0,255,cv.THRESH_BINARY+cv.THRESH_OTSU)
ret_v, th_v = cv.threshold(s,0,255,cv.THRESH_BINARY+cv.THRESH_OTSU)
cv.imwrite("th_h.png",th_h)
cv.imwrite("th_s.png",th_s)
cv.imwrite("th_v.png",th_v)
contours, hierarchy = cv2.findContours(thresh,mode,method)
cv2.drawContours(image,contours,contourIdx,couleur, thickness)
x,y,w,h = cv.boundingRect(contours[i])
import cv2import numpy as npimg=cv2.imread ("fleur.png");hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)h,s,v= cv2.split(hsv)ret_h, th_h = cv2.threshold(h,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)ret_s, th_s = cv2.threshold(s,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)#Fusion th_h et th_sth=cv2.bitwise_or(th_h,th_s)#Ajouts de bord à l'imagebordersize=10th=cv2.copyMakeBorder(th, top=bordersize, bottom=bordersize, left=bordersize, right=bordersize, borderType= cv2.BORDER_CONSTANT, value=[0,0,0] )#Remplissage des contoursim_floodfill = th.copy()h, w = th.shape[:2]mask = np.zeros((h+2, w+2), np.uint8)cv2.floodFill(im_floodfill, mask, (0,0), 255)im_floodfill_inv = cv2.bitwise_not(im_floodfill)th = th | im_floodfill_inv#Enlèvement des bord de l'imageth=th[bordersize: len(th)-bordersize,bordersize: len(th[0])-bordersize]resultat=cv2.bitwise_and(img,img,mask=th)cv2.imwrite("im_floodfill.png",im_floodfill)cv2.imwrite("th.png",th)cv2.imwrite("resultat.png",resultat)contours, hierarchy = cv2.findContours(th,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)for i in range (0, len(contours)) :mask_BB_i = np.zeros((len(th),len(th[0])), np.uint8)x,y,w,h = cv2.boundingRect(contours[i])cv2.drawContours(mask_BB_i, contours, i, (255,255,255), -1)BB_i=cv2.bitwise_and(img,img,mask=mask_BB_i)if h >15 and w>15 :BB_i=BB_i[y:y+h,x:x+w]cv2.imwrite("BB_"+str(i)+".png",BB_i)