Académique Documents
Professionnel Documents
Culture Documents
1. Implémentation de la convolution
Dans le traitement d'image, un noyau ou un masque de convolution est une petite matrice utilisée pour
effectuer des opérations sur les images, telles que, le lissage (atténuation du bruit), la détection des
contours, etc. Ceci est accompli en faisant une convolution entre le noyau et une image. Ou plus
simplement, lorsque chaque pixel de l'image de sortie est une fonction des pixels voisins (y compris lui-
même) de l'image d'entrée et le noyau de cette fonction. L’opération de convolution est illustrée dans la
Figure -1- . Le code suivant est une implémentation de l’opération de convolution.
# Convolution function
def convolution(pad_img, kernel):
p = int(kernel.shape[0]/2)
pheight, pwidth = pad_img.shape
img_conv = np.zeros(pad_img.shape)
for i in range(p, pheight-p):
for j in range(p, pwidth-p):
roi = pad_img[i-p:i+p+1, j-p:j+p+1]
img_conv[i, j] = np.sum(kernel * roi)
img_conv = img_conv[p:-p, p:-p]
return img_conv
Figure 1 Convolution
[ ]
1 1 1 1 1
[ ]
1 1 1 1 1 1 −1 −1 −1
1 1 1 1 1 × −1 8 −1
30
1 1 1 1 1 −1 −1 −1
1 1 1 1 1
Dans ce qui suit, nous allons appliquer sur une image en niveau de gris les filtres définis par ces deux
noyaux. Nous allons utiliser dans un premier temps la fonction prédéfinie cv2.filter2D d’OpenCV,
après nous allons appliquer notre fonction de convolution et comparer entre le résultat obtenu par ces
deux fonctions. Que constatez-vous ?
# %%
# Define the convolution kernel: blurring kernel
kernel = np.ones((5, 5))/30
# Apply convolution
# Method 1: using cv2.filter2D
img_conv = cv2.filter2D(src=gray_img, ddepth=cv2.CV_64F, kernel=kernel)
# %%
# Define the convolution kernel: edge detection kernel
kernel = np.array([[-1,-1,-1],[-1,8,-1],[-1,-1,-1]])
img_conv = cv2.filter2D(src=gray_img, ddepth=cv2.CV_64F, kernel=kernel)
img2_conv = convolution(pad_img, kernel)
figure, plots = plt.subplots(1, 2)
plots[0].imshow(np.uint8(np.absolute(img_conv)), cmap='gray')
plots[0].axis('off')
plots[0].set_title('Conv Image')
plots[1].imshow(np.uint8(np.absolute(img2_conv)), cmap='gray')
plots[1].axis('off')
plots[1].set_title('Manual Conv Image')
M1 RSD - TP Multimédia USTHB 2022/2023
plt.show()
2. Exercice :
Soit les noyaux suivants :
[ ] [ ] [ ]
−1 −1 −1 0 −1 0 −1 0 1
−1 8 −1 −1 5 −1 −2 0 2
−1 −1 −1 0 −1 0 −1 0 1
[ ] [ ]
−2 −1 0 1 2 1 1
−1 1 1 2 4 2 ×
16
0 1 2 1 2 1