Adloun

Convolution séparable — économiser un facteur

Exercice · informatique (tronc commun des prépas scientifiques), chapitre 8 — Matrices de pixels et images

É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 .

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.