Matrices de pixels et traitement d’images
CPGE - Niveau SUP
Séance de 2 heures
Objectifs de la séance
— Comprendre la représentation d’une image sous forme de tableau 2D (matrices).
— Implémenter des transformations géométriques (rotation, redimensionnement).
— Maîtriser le produit de convolution pour filtrer une image (flou, contours).
— Manipuler les doubles boucles for imbriquées pour parcourir des voisinages.
1 Représentation matricielle
Une image en niveaux de gris de dimensions H × W (Hauteur × Largeur) est stockée comme un
tableau bidimensionnel où chaque case M [i][j] représente l’intensité lumineuse du pixel (souvent un
entier de 0 à 255).
(0,0)
j (colonnes / Largeur W )
12 45 255
78 10 120
30 200 50
i (lignes / Hauteur H)
2 Transformations Géométriques
2.1 Rotation de 90° (sens horaire)
Pour une matrice carrée de taille n, le pixel (i, j) se déplace vers la position (j, n − 1 − i).
def rotation_90(img):
n = len(img) # Supposons img carrée
# Création d'une nouvelle matrice vide
nouvelle = [[0]*n for _ in range(n)]
for i in range(n):
for j in range(n):
nouvelle[j][n-1-i] = img[i][j]
return nouvelle
2.2 Réduction et Agrandissement
— Réduction (facteur 2) : On ne garde qu’un pixel sur deux (échantillonnage).
— Agrandissement (facteur 2) : On duplique chaque pixel dans un bloc 2 × 2.
Exercice 1. Écrire une fonction agrandir(img) qui double la taille d’une image. Si l’image originale
est de taille H × W , l’image de sortie doit être (2H) × (2W ).
1
3 Filtrage par Convolution
Le principe est de recalculer la valeur d’un pixel en fonction de ses voisins directs à l’aide d’un
noyau (petite matrice, souvent 3 × 3).
Fenêtre de voisinage
CalculPdu nouveau
P1 pixel :
Cible ′ 1
Pi,j = di=−1 dj=−1 Mi+di,j+dj ×
Kdi,dj
Où K est le noyau de convolution.
3.1 Exemples de noyaux classiques
— Flou (Moyenneur) : Toutes les cases valent 1/9.
On lisse lesvariations.
−1 0 1
— Détection de contours (Sobel vertical) : K = −2 0 2. Met en évidence les gradients
−1 0 1
horizontaux.
def convolution_grise(img, noyau):
H, W = len(img), len(img[0])
# Nouvelle image (on ignore les bords pour simplifier)
res = [[0]*W for _ in range(H)]
for i in range(1, H-1):
for j in range(1, W-1):
somme = 0
for di in [-1, 0, 1]:
for dj in [-1, 0, 1]:
somme += img[i+di][j+dj] * noyau[di+1][dj+1]
res[i][j] = int(somme)
return res
4 Activité Pratique (1 heure)
Exercice 2 (Effet miroir). Écrire une fonction qui réalise une symétrie horizontale de l’image (le pixel
à gauche passe à droite).
0 −1 0
Exercice 3 (Le filtre "Passe-Haut" (Netteté)). En utilisant le noyau K = −1 5 −1, expliquez
0 −1 0
pourquoi l’image semble plus "nette".
Note : Attention à saturer les valeurs entre 0 et 255 après calcul.
Synthèse : Complexité
Pour une image de N pixels (N = H × W ) :
— Les opérations géométriques sont en coût linéaire O(N ).
— La convolution avec un noyau de taille fixe k × k est aussi en O(N ) (plus précisément
O(k 2 · N )).