TP2 : Prétraitement d’images
Matière : Vision par ordinateur
Niveau : FIA3-GL-AL
E-mail : [email protected]
Exercice1 : Histogramme.
1. Lire l’image « fruits.jpg».et affiche au niveau de gris.
2. Déterminer et afficher l’histogramme de l’image au niveau de gris (plt.hist) .
3. Améliorer le contraste en utilisant la méthode d’égalisation d’histogramme
(cv2.equalizeHist).
4. Lire l’image « fruits.jpg» en mode RGB ,déterminer et afficher l’histogramme couleur de
l’image(cv.calcHist) .
Exercice 2: Segmentation
1. Lire l’image « circles.png »et afficher au niveau de gris.
2. Créer le masque binaire en utilisant « cv2.threshold »
3. Segmenter l’image en utilisant « cv2.bitwise_and »
4. Lire l’image 'circles.png'et la convertir en image HSV
5. Créer des masques binaires qui désignent l’emplacement des cercles bleu, jaune et rouge
en utilisant « cv2.inRange » (voir annexe)
6. Afficher les résultats de segmentation en utilisant ces masques binaires
Exercice 3 : Transformée de Fourier
1. Lire l’image « images.jpg » .
2. Calculez la transformée de Fourier 2D de cette image (numpy.fft.fft2), faite le shift puis
visualisez et analysez le spectre d’énergie obtenu (numpy.fft.fftshift).
3. Restituer l'ordre initial des fréquences avec la fonction (numpy.fft.ifftshift) puis appliquer
la transformée de Fourier inverse avec la fonction (numpy.fft.ifft2)
4. Recopier le code de l’annexe , puis intégrer le code de filtre idéal dans l’annexe dans le
code de question 1 et afficher le résultat
5. Appliquer le filtre gaussien et le filtre idéal à basse fréquence et afficher les résultats.
6. Appliquer le filtre gaussien à haute fréquence et afficher le résultat.
7. Tester les mêmes filtres en utiliser l’image Lenna.jpg
Exercice 4: Filtre et détection de contour
1. Lire l’image « Lenna.jpg ».
2. Ajouter un bruit gaussien à l’image en utilisant random_noise
3. Appliquer sur l’image bruitée le filtre moyenneur à l’aide de la fonction cv2.blur
4. Appliquer sur l’image bruitée le filtre médian à l’aide de la fonction cv2.medianBlur
5. Appliquer sur l’image bruitée le filtre wiener à l’aide de la fonction restoration.wiener
6. Utiliser les filtres suivants pour détecter les contours de l’image « Lenna.jpg »
a. Filtre de Canny
b. Filtre de Laplacien
c. Filtre de Sobel
Exercice 5: Operateurs morphologiques
1. Lire et affiche l’image « circles.png »
2. Binariser l’image
3. Effectuer les opérateurs morphologiques suivante :
a. Érosion « cv2.erode»
b. Dilatation « cv2.dilate»
c. Ouverture « cv2.morphologyEx»
d. Fermeture « cv2.morphologyEx»
4. Interpréter les différents résultats
Annexe 1
#Lire l'image "image.jpg" en niveau de gris
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
#Lire l'image "image.jpg" en couleur
image = cv2.imread('image.jpg', cv2.IMREAD_COLOR)
# Déterminer et afficher l'histogramme de l'image en niveau de gris
hist = cv2.calcHist([image], [0], None, [256], [0, 256])
plt.hist(image.ravel(), 256, [0, 256])
Annexe 2
img_c1 = cv2.imread("image.jpg", 0)
# Calculer la transformée de Fourier 2D
img_c2 = np.fft.fft2(img_c1)
# Faire le shift pour le centre de l'image
img_c3 = np.fft.fftshift(img_c2)
# Restaurer l'ordre initial des fréquences
img_c4 = np.fft.ifftshift(img_c3)
# Appliquer la transformée de Fourier inverse
img_c5 = np.fft.ifft2(img_c4)
#affficher 5 images en tabulation
plt.figure(figsize=(6.4*5, 4.8*5), constrained_layout=False)
plt.subplot(151), plt.imshow(img_c1, "gray"), plt.title("Original Image")
plt.subplot(152), plt.imshow(np.log(1+np.abs(img_c2)), "gray"),
plt.title("Spectrum")
plt.subplot(153), plt.imshow(np.log(1+np.abs(img_c3)), "gray"),
plt.title("Centered Spectrum")
plt.subplot(154), plt.imshow(np.log(1+np.abs(img_c4)), "gray"),
plt.title("Decentralized")
plt.subplot(155), plt.imshow(np.abs(img_c5), "gray"), plt.title("Processed
Image")
plt.show()
Annexe 3
def distance(point1,point2):
return sqrt((point1[0]-point2[0])**2 + (point1[1]-point2[1])**2)
def idealFilterLP(D0,imgShape):
base = np.zeros(imgShape[:2])
rows, cols = imgShape[:2]
center = (rows/2,cols/2)
for x in range(cols):
for y in range(rows):
if distance((y,x),center) < D0:
base[y,x] = 1
return base
def idealFilterHP(D0,imgShape):
base = np.ones(imgShape[:2])
rows, cols = imgShape[:2]
center = (rows/2,cols/2)
for x in range(cols):
for y in range(rows):
if distance((y,x),center) < D0:
base[y,x] = 0
return base
def gaussianLP(D0,imgShape):
base = np.zeros(imgShape[:2])
rows, cols = imgShape[:2]
center = (rows/2,cols/2)
for x in range(cols):
for y in range(rows):
base[y,x] = exp(((-distance((y,x),center)**2)/(2*(D0**2))))
return base
def gaussianHP(D0,imgShape):
base = np.zeros(imgShape[:2])
rows, cols = imgShape[:2]
center = (rows/2,cols/2)
for x in range(cols):
for y in range(rows):
base[y,x] = 1 - exp(((-distance((y,x),center)**2)/(2*(D0**2))))
return base
Annexe 4
LowPassCenter = center * idealFilterLP(50,img.shape)
LowPass = np.fft.ifftshift(LowPassCenter)
inverse_LowPass = np.fft.ifft2(LowPass)
plt.imshow(np.abs(inverse_LowPass), "gray"), plt.title("Ideal Low Pass")
Annexe 5
lower_red = np.array([150, 30, 30])
upper_red = np.array([190, 255, 255])
lower_blue = np.array([100, 60, 60])
upper_blue = np.array([140, 255, 255])
lower_yellow = np.array([5, 100, 100])
upper_yellow = np.array([40, 255, 255])