Annexes codes sources
TP1
import numpy as np
import cv2
#question 1
def soldes(prix):
a = prix * 0.8
b = prix * 0.6
c = prix * 0.5
return a,b,c
retour = soldes(130)
print(f"les prix soldés sont de {retour}")
#Q2
tableau = np.array(np.random.randint(0,10,size=(3,4)))
print(tableau)
print("Collone:")
print(np.sum(tableau,axis=0)) #0 est en collone, 1 ou -1 est en ligne
print("Ligne:")
print(np.sum(tableau,axis=-1)) #0 est en collone, 1 ou -1 est en ligne
#Q3
#Wait key est une fonction bloquante qui attend le frappe d'une touche de clavier
img = cv2.imread('GE141002.bmp',cv2.IMREAD_GRAYSCALE) # img est un tableau Numpy
cv2.imshow("Beton", img)
# Mise en pause du programme jusqu'à ce que l'utilisateur appuie sur une touche
x,y = img.shape[:2]
print(f" taille de l'image x:{x} y:{y}")
#Q4
print(img)
#l'image est un tableau de 2 dimension, avec les valeurs de niveau de gris dans les pixels respective au coordonées x y
#le cas où l'image est stockée dans un tableau a 3 dimensions, c'est le cas ou l'image traitée est en couleur.
#q5
#1: Opération de
#2: Opération de
#3: Opération de
#Q3.1
rest, img2 = cv2.threshold(img,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
print(f"seuil:{rest}")
cv2.imshow("Traitee", img2)
#cv2.imwrite("Q3.1.png", img2) sauvegardage Image
#Q3.2
el_struct = cv2.getStructuringElement(cv2.MORPH_RECT,(6,6))
img3 = cv2.morphologyEx(img2,cv2.MORPH_OPEN,el_struct)
cv2.imshow("Apres Ouverture", img3)
#cv2.imwrite("Q3.2.png", img3) sauvegardage Image
img4 = cv2.morphologyEx(img3,cv2.MORPH_CLOSE,el_struct)
cv2.imshow("Apres Fermeture", img4)
#cv2.imwrite("Q3.2.bis.png", img4) sauvegardage Image
#Q3.4
Granulats, _ = cv2.findContours(img4, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
nb_granulats = len(Granulats)
print(f"Nombre de Granulats :{nb_granulats}")
#Q3.5
img5 =cv2.drawContours(img4, Granulats, -1, 125, 3)
cv2.imshow("Contours",img5)
# cv2.imwrite("Q3.5.png", img5) sauvegardage Image
#Q3.6 et Q.7
img6 = cv2.cvtColor(img5,cv2.COLOR_GRAY2BGR)
air_total = 0
for i, contour in enumerate(Granulats):
air = cv2.contourArea(contour)
air_total += air
print(f"Granulat {i+1}: Air en Pixel = {air}")
#rectangle englobant chaque Granulats
x,y,w,h = cv2.boundingRect(contour)
#position du texte
text_x = x+w // 2
text_y = y+h // 2
#ecriture du numéro
cv2.putText(img6,str(i+1), (text_x,text_y),cv2.FONT_HERSHEY_DUPLEX, 0.5, (0,0,255))
air_moyen = air_total / len(Granulats)
print(f"Air moyen des granulats:{air_moyen} pixels")
cv2.imshow("Contours",img6)
#cv2.imwrite("Q3.7.png", img6) sauvegardage Image
cv2.waitKey(0)
# Fermeture de toutes les fenêtres ouvertes
cv2.destroyAllWindows()
TP2
import numpy as np
import cv2
import matplotlib.pyplot as plt
#entrainement partie 2
# ecole = 'unilasalle'
# print(ecole[3:7]) # s'affiche: lasa
# print(ecole[5:]) # s'affiche: salle
# print(ecole[:3]) # s'affiche: uni
# Déclaration en dur d'un tableau T à 2 lignes et 3 colonnes
# T = np.array([[1, 2, 3], [4, 5, 6]])
# T2 = T[:, 0:2]
# print(T)
# print(T2)
#-> extraction de toutes les lignes et des 2 premières colonnes de T
#lire l'image
img = cv2.imread('LAIT_KO.bmp',cv2.IMREAD_GRAYSCALE)
#Prendre la somme en ligne des valeurs de pixels
projection_ligne = np.sum(img,axis = 0)
#valeur max de cette ligne
valeur_max_ligne = np.max(projection_ligne)
#procédée idem
projection_colonne = np.sum(img,axis = 1)
valeur_max_colonne = np.max(projection_colonne)
#à decommenter si on veut voir les tracées
# plt.plot(projection_ligne)
# plt.plot(projection_colonne)
# plt.show()
print(f"Valeur Max ligne {valeur_max_ligne}")
print(f"Valeur Max colonne {valeur_max_colonne}")
valeur_seuil_front_colonne = valeur_max_colonne/2
valeur_seuil_front_ligne = valeur_max_ligne/2
Bordure_Superieur = np.where(projection_ligne> valeur_seuil_front_ligne)[0][0] #Tu n'a que la premiere valeur du tableau
Bordure_Inferieur = np.where(projection_ligne> valeur_seuil_front_ligne)[0][-1] #Tu a la derniere valeur du tableau
Bordure_Gauche = np.where(projection_colonne > valeur_seuil_front_colonne)[0][0]
Bordure_Droite = np.where(projection_colonne > valeur_seuil_front_colonne)[0][-1]
#En ayant ces 4 valeurs, on peux retrouver les 4 coins du rectangle
#Peut etre faire mieux plus tard quand l'image n'est pas réelement droit
# print(Bordure_Droite)
# print(Bordure_Gauche)
# print(Bordure_Superieur)
# print(Bordure_Inferieur)
plt.show()
#cv2.rectangle(img,(Bordure_Inferieur,Bordure_Droite),(Bordure_Superieur,Bordure_Gauche),125,5)
#cv2.imshow('image', img)
#3.2 Découpage de la brique de lait
Decoupage = img[Bordure_Gauche:Bordure_Droite, Bordure_Superieur:Bordure_Inferieur]
cv2.imshow('Decoup', Decoupage)
#decouper la date
Decoupage_date = Decoupage[303:303+95 , 57:57+41]
# Question 4 6
#A l’étape précédente, était-il nécessaire de détecter les quatre cotés de la brique de lait pour pouvoir extraire la date
#Tout depend de comment la photo est prise et si on peut avoir la photo toujour dans le même angle, même position dans l'image, cela implique de caller les brique de lait dans le systeme
#dans un endroit a faible tolérance, et de les arreter, prendre la photo, puis de les relancer, dans un contexte de production, cela est très inéfficace, donc on peut prefere de prendre le
#photo dans l'elan du brique de lait, risquant une décalage, c'est pourquoi on doit reprendre la.
#
#Mais en plus, la methode otsu ne fonctionnera pas correctement, car il y aura beacoup de noir, qui nous rendra le filtre otsu non voulu
#
#binarisation
_, Decoupage_binarized = cv2.threshold(Decoupage_date,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
cv2.imshow('binarized', Decoupage_binarized)
Decoupe_Copy= np.copy(Decoupage_binarized)
# 5 Extraction du premier Caractère de la date
Contours, _ = cv2.findContours(Decoupage_binarized, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
nb_Contours = len(Contours)
print(f"Nombre de Caratéres :{nb_Contours}")
Decoupage_binarized_Contours =cv2.drawContours(Decoupage_binarized, Contours, -1, 125, 3)
cv2.imshow("Contours",Decoupage_binarized_Contours)
img_Extraction = cv2.cvtColor(Decoupage_binarized_Contours,cv2.COLOR_GRAY2BGR)
air_total = 0
for i, contour in enumerate(Contours):
air = cv2.contourArea(contour)
air_total += air
#rectangle englobant chaque Granulats
x,y,w,h = cv2.boundingRect(contour)
#position du texte
text_x = x+w // 2
text_y = y+h // 2
#ecriture du numéro
cv2.putText(img_Extraction,str(i+1), (text_x,text_y),cv2.FONT_HERSHEY_DUPLEX, 0.5, (0,0,255))
cv2.imshow("Extrait",img_Extraction)
#Initialisation de l'etalon
Etalon = cv2.imread('1.BMP',cv2.IMREAD_GRAYSCALE)
_,Etalon_Binarisee = cv2.threshold(Etalon,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
height, width = np.shape(Etalon)
print(height)
print(width)
x,y,w,h = cv2.boundingRect(Contours[0])
img_cara_Extraction = Decoupe_Copy[y:y+height,x:x+width] #attention, j'ai rajoutée une ligne de comparaison pour que la dimension correspond
cv2.imshow("Caractere",img_cara_Extraction)
#6
#Q7
# print(np.size(Etalon_Binarisee,axis = 0))
# print(np.size(img_cara_Extraction,axis = 0))
cv2.imshow('Bonjou',Etalon_Binarisee)
difference = cv2.absdiff(img_cara_Extraction,Etalon_Binarisee)
Nb_Pixel_diff= np.count_nonzero(difference)
Pourcentage = Nb_Pixel_diff/np.size(Etalon)*100
print(f"Nombres de pixels different {Nb_Pixel_diff}")
print(f"Nombre de pixel dans l'image etalon {np.size(Etalon)}")
print(f"Pourcentage de difference {Pourcentage} %")
if Pourcentage <20 :
print("caractére correct")
else:
print("caractére incorrect")
cv2.waitKey(0)
# Fermeture de toutes les fenêtres ouvertes
cv2.destroyAllWindows()
TP3 image fixe
import cv2
import numpy as np
Image_Bille = cv2.imread("boules.png")
cv2.imshow("Bonjour",Image_Bille)
taille_x, taille_y, nbr_canneaux = np.shape(Image_Bille)
print(f'Taille de x {taille_x}')
print(f'Taille de y {taille_y}')
print(f'Taille de canneaux {nbr_canneaux}')
Image_Bille_bleu, Image_Bille_vert, Image_Bille_rouge = cv2.split(Image_Bille)
cv2.imshow("Rouge",Image_Bille_rouge)
#En faisant la methode des seuils, nos n'aurons jamais seulement le rouge, parceque on aura toujour des composant.
#Il faudrai faire un tri sur les trois variable RGB et afficher la abnde passante de la couleur rouge sur une image en couleur et non juste la variable R qui retourne une image en noir et blanc
#ce qui fait que sur le retour on aura toutes les couleurs qui ont une composante rouge, ce qui ne fait pas de tri.
##HSV
Image_Bille_HSV = cv2.cvtColor(Image_Bille,cv2.COLOR_BGR2HSV)
Image_Bille_Hue, Image_Bille_Saturation, Image_Bille_lightness = cv2.split(Image_Bille_HSV)
I = 10
Masque_1 = cv2.inRange(Image_Bille_Hue,0,I)
Masque_2 = cv2.inRange(Image_Bille_Hue,179-I,179)
Masque_final = cv2.bitwise_or(Masque_1,Masque_2)
cv2.imshow('Rouge',Masque_final)
#ici le problème c'est qu'on a toujours la bille blanche qui est affiché
##Question 13
rouge_inferieur = np.array([0,50,50])
rouge_superieur = np.array([I,255,255])
rouge_inferieur_2 = np.array([180-I,50,50])
rouge_superieur_2 = np.array([180,255,255])
Masque_1 = cv2.inRange(Image_Bille_HSV,rouge_inferieur,rouge_superieur)
Masque_2 = cv2.inRange(Image_Bille_HSV,rouge_inferieur_2,rouge_superieur_2)
Masque_totale = cv2.bitwise_or(Masque_1,Masque_2)
cv2.imshow('Rouge nouveau',Masque_totale)
##le résultat n'est pas satisfaisant car on a toujours les contours des billes bleues qui s'affichent mais on a plus la bille blanche
el_struct = cv2.getStructuringElement(cv2.MORPH_RECT,(6,6))
Ouverture = cv2.morphologyEx(Masque_totale,cv2.MORPH_OPEN,el_struct)
cv2.imshow('Ouverture',Ouverture)
Fermeture = cv2.morphologyEx(Ouverture,cv2.MORPH_CLOSE, el_struct)
cv2.imshow('Fermeture',Fermeture)
Countours, _ = cv2.findContours(Fermeture, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
Img_Contours =cv2.drawContours(Fermeture, Countours, -1, 125, 2)
cv2.imshow('Countours',Img_Contours)
for contour in Countours:
(x,y), radius = cv2.minEnclosingCircle(contour)
center = (int(x),int(y))
radius = int(radius)
#print(center)
cv2.circle(Image_Bille, center, radius, (0,255,0),2)
cv2.imshow('image avec cercle', Image_Bille)
cv2.waitKey(0)
cv2.destroyAllWindows()
TP3 Video
import cv2
import numpy as np
def findCercleRouge(Image):
Image_HSV = cv2.cvtColor(Image,cv2.COLOR_BGR2HSV)
I = 8
rouge_inferieur = np.array([0,50,50])
rouge_superieur = np.array([I,255,255])
rouge_inferieur_2 = np.array([180-I,50,50])
rouge_superieur_2 = np.array([180,255,255])
Masque_1 = cv2.inRange(Image_HSV,rouge_inferieur,rouge_superieur)
Masque_2 = cv2.inRange(Image_HSV,rouge_inferieur_2,rouge_superieur_2)
Masque_totale = cv2.bitwise_or(Masque_1,Masque_2)
el_struct = cv2.getStructuringElement(cv2.MORPH_RECT,(6,6))
Ouverture = cv2.morphologyEx(Masque_totale,cv2.MORPH_OPEN,el_struct)
Fermeture = cv2.morphologyEx(Ouverture,cv2.MORPH_CLOSE, el_struct)
Countours, _ = cv2.findContours(Fermeture, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
for contour in Countours:
(x,y), radius = cv2.minEnclosingCircle(contour)
center = (int(x),int(y))
radius = int(radius)
#print(center)
cv2.circle(Image, center, radius, (0,255,0),2)
cv2.imshow('TP3', Image)
Image_Bille = cv2.imread("boules.png",)
findCercleRouge(Image_Bille)
cap = cv2.VideoCapture('billes.mp4')
# Vérifier si succès
if not cap.isOpened():
print("Erreur : impossible d'ouvrir la vidéo.")
exit()
while True:
# Lire une frame de la vidéo
ret, frame = cap.read()
# Vérifier si la fin de la vidéo n'est pas atteinte
if not ret:
break
# Afficher la frame
findCercleRouge(frame)
# Attendre 100 millisecondes avant de passer à la frame suivante
cv2.waitKey(100)
# Libérer les ressources de la vidéo et fermer la fenêtre d'affichage
cv2.waitKey(0)
cap.release()
cv2.destroyAllWindows()