Adloun

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 .

Exercices semblables

Le cours du chapitre · Tous les exercices du chapitre