Vous êtes sur la page 1sur 3

M1 RSD - TP Multimédia USTHB 2022/2023

TP N° 4 - Convolution et application des filtres

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

 Soit les noyaux suivants :


M1 RSD - TP Multimédia USTHB 2022/2023

[ ]
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)

# Method 2: using the defined function


# Padding the image
p = int(kernel.shape[0]/2)
pad_img = np.zeros((gray_img.shape[0]+2*p, gray_img.shape[1]+2*p))
pad_img[p:-p, p:-p] = gray_img
img2_conv = convolution(pad_img, kernel)

# Display the blurred images


figure, plots = plt.subplots(1, 2)
plots[0].imshow(np.uint8(img_conv), cmap='gray')
plots[0].axis('off')
plots[0].set_title('Conv Image')  
plots[1].imshow(np.uint8(img2_conv), cmap='gray')
plots[1].axis('off')
plots[1].set_title('Manual Conv Image')
plt.show()

# %%
# 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

Ecrire un programme qui permet de :


 Lire une image couleur et la convertir en niveau de gris (vous pouvez utiliser l’image
« cablecar.bmp ») ;
 Diviser l’image en 16 blocs de même dimension, et appliquer sur chaque bloc un filtre dont le noyau est
choisi d’une manière aléatoire parmi les noyaux ci-dessus;
 Regrouper les 16 blocs filtrés dans une seule image et l’afficher.

Vous aimerez peut-être aussi