informatique (tronc commun des prépas scientifiques) · Chapitre 8 · Exercice de TD
Convolution séparable — économiser un facteur
Matrices de pixels et images · niveau 3 (difficile)
Énoncé
Montrer qu'un flou moyenneur peut s'implémenter de manière séparée en effectuant une passe de moyenne horizontale de taille puis une passe verticale de même taille. Écrire le code associé et comparer les coûts.
Corrigé
Équivalence mathématique : La moyenne d'un bloc de taille peut se factoriser sous la forme :
def flou_separable(img: list, k: int) -> list:
n, p = len(img), len(img[0])
r = k // 2
# Passe 1 : Moyenne horizontale
h = [[0] * p for _ in range(n)]
for i in range(n):
for j in range(r, p - r):
h[i][j] = sum(img[i][j + b] for b in range(-r, r + 1)) // k
# Passe 2 : Moyenne verticale sur la matrice intermédiaire h
res = [ligne[:] for ligne in h]
for i in range(r, n - r):
for j in range(p):
res[i][j] = sum(h[i + a][j] for a in range(-r, r + 1)) // k
return res
La convolution bidimensionnelle classique effectue lectures par pixel. La version séparable n'effectue que opérations (une moyenne de taille sur chaque dimension). Pour un grand filtre (ex: ), le gain est de opérations contre , soit une accélération d'un facteur .