# Débruitage par patchs

Le débruitage par morceaux (patchs) est une technique de débruitage d'image utilisant l'algorithme de réduction du bruit numérique appelé en Anglais "non-local means". Contrairement aux filtres habituels qui réalisent une moyenne des valeurs du groupe de pixels localisés autour d'un pixel cible afin de réduire le bruit, le filtre "non-local means" réalise une moyenne de la totalité des valeurs des pixels contenus dans l'image, pondérées en fonction de leur similarité avec le pixel cible. Le résultat d'un tel filtrage permet d’amoindrir la perte de détails au sein de l'image, comparé aux filtres réalisant des moyennes localement.
Comparé aux autres méthodes usuelles de réduction de bruit comme le filtre de Gauss ou le filtre de Wiener, le bruit généré par l'algorithme "non-local means" est plus proche du bruit blanc. L'algorithme "non-local means" a récemment été étendu à d'autres domaines d'application du traitement d'images comme le désentrelacement et l'interpolation visuelle.

## Définition

Soit $\Omega$ l'ensemble des points d'une image. On définit $p$ et $q$, deux points au sein de l'image. L'algorithme est alors défini ainsi :
    $u(p)={1 \over C(p)}\int _{\Omega }v(q)f(p,q)\,\mathrm {d} q.$
avec $u(p)$ la valeur filtrée de l'image au point $p$, $v(q)$ la valeur non filtrée de l'image au point $q$, $f(p,q)$ la fonction de pondération, l'intégrale étant évaluée $\forall q\in \Omega$.
$C(p)$ est un facteur de normalisation, défini par :
    $C(p)=\int _{\Omega }f(p,q)\,\mathrm {d} q.$

## Fonctions de pondération usuelles

L'objectif des fonctions de pondération, $f(p,q)$, est de déterminer la similarité entre l'image au point $p$ et l'image au point $q$. Il existe plusieurs fonctions de pondération.

### Pondération de Gauss

La fonction gaussienne de pondération met en place une distribution normale avec une moyenne, $\mu =B(p)$ et un écart type variable :
    $f(p,q)=e^{-{{\left\vert B(q)-B(p)\right\vert ^{2}} \over h^{2}}}$
où $h$ est le paramètre de filtrage (i.e., l'écart type) et $B(p)$ est la valeur moyenne des points centrés autour du point $p$

## Algorithme intégral

Pour une image, $\Omega$, avec des points distincts (des pixels), un algorithme intégral est nécessaire.
    $u(p)={1 \over C(p)}\sum _{q\in \Omega }v(q)f(p,q)$
où $C(p)$ est donné par :
    $C(p)=\sum _{q\in \Omega }f(p,q)$
Ainsi, avec une fonction gaussienne de pondération,
    $f(p,q)=e^{-{{\left\vert B(q)-B(p)\right\vert ^{2}} \over h^{2}}}$
où $B(p)$ est donné par :
    $B(p)={1 \over |R(p)|}\sum _{i\in R(p)}v(i)$
où $R(p)\subseteq \Omega$ et est un carré de pixels autour de $p$ et $|R(p)|$ est le nombre de pixels dans la région $R$.

## Paramètres

Le réglage des paramètres d'une méthode est un processus délicat, et souvent de larges différences avec la théorie apparaissent à cette étape. Diverses techniques permettent de régler les paramètres en statistiques. La méthode la plus couramment utilisée pour calibrer ces paramètres repose sur la validation croisée (cross validation).
Le choix de la fonction de pondération doit correspondre à la définition d'une norme. En général, on utilise la pondération Gaussienne correspondant au bruit blanc.
Le choix de l'écart-type (h) : c'est sûrement le paramètre le plus délicat à fixer. Si ce choix est global, c'est-à-dire que h est le même pour tous les pixels de l'image, il est possible de fixer, à l'aide d'une heuristique, la valeur de h. En revanche un choix local demande plus d'ingéniosité. Le choix de la taille des morceaux : la taille du morceau doit évoluer avec l'intensité du bruit pour garder en robustesse et ainsi mieux distinguer les zones, sans risque de confusion. La taille du morceau est aussi un élément qui influence le temps de calcul. En effet, il ne faut pas oublier que pour chacun des pixels de l'image, tous les morceaux devront être traités.

## Exemple

* Exemple d'un traitement d'une image par l'application du débruitage par morceaux. La première photo est bruitée, la seconde montre les morceaux détectés et la dernière est le résultat du débruitage.
* Image bruitée
* Détection des patchs
* Image débruitée
Dans un premier temps, on se munit d'une image bruitée quelconque. Ensuite, on considère un pixel à débruiter, puis on détecte les morceaux similaires à la région du pixel cible au sein de l'image (sur l'exemple, les cadres verts représentent une forte similarité avec la zone du pixel à débruiter, les bleus une similarité moyenne et les rouge ne sont pas du tout similaires). Enfin, on débruite l'intégralité de l'image en répétant cette procédure pour tous les pixels de l'image.