Noyau (traitement d'image)

Un article de Wikipédia, l'encyclopédie libre.

En traitement d'images, un noyau, une matrice de convolution ou un masque est une petite matrice utilisée pour le floutage, l'amélioration de la netteté de l'image, le gaufrage, la détection de contours, et d'autres. Tout cela est accompli en faisant une convolution entre le noyau et l'image.

Détails[modifier | modifier le code]

Suivant les valeurs, un noyau peut avoir un grand nombre d'effets.

Opération Noyau Résultat
Identité Vd-Orig.png
La détection de contours Vd-Edge1.png
Vd-Edge2.png
Vd-Edge3.png
Amélioration de la netteté
Vd-Sharp.png
Box blur
(normalized)
Vd-Blur2.png
Flou de Gauss 3 × 3
(approximation)
Vd-Blur1.png
Flou de Gauss 5 × 5
(approximation)
Vd-Blur Gaussian 5x5.png
Masque flou 5 × 5
Basé sur un flou de Gauss avec un montant en 1 et un seuil de 0
(sans masquage)
Vd-Unsharp 5x5.png

Ce sont juste quelques exemples montrant les effets des noyaux de convolutions sur les images.

Origine[modifier | modifier le code]

L'origine est la position du noyau qui est au-dessus (conceptuellement) du pixel courant. Elle peut être à l’extérieur du noyau, cependant, elle correspond la plupart du temps à un élément du noyau. Pour un noyau symétrique, l'origine est souvent l'élément central.

Convolution[modifier | modifier le code]

La convolution est le processus consistant à ajouter chaque élément de l'image à ses voisins immédiats, pondéré par les éléments du noyau. C'est une forme de produit de convolution. Il devra être noté que les opérations matricielles effectuées (les convolutions) ne sont pas des multiplications traditionnelles de matrices malgré le fait que ce soit noté par un « * ».

Par exemple, si nous avons deux matrices 3×3, la première étant le noyau et la seconde une partie de l'image, la convolution est le processus consistant à retourner les colonnes et les lignes du noyau puis de multiplier localement les valeurs ayant la même position, puis sommer le tout. L'élément au coordonnée [2, 2] (l'élément central) de l'image de sortie devrait être pondéré par la combinaison de toutes les entrées de la matrice de l'image, avec les poids données par le noyau comme suit :

Les autres entrées devraient être pondérées de manière similaire, appliquée à tous les pixels de l'image.

La valeur d'un pixel dans l'image de sortie peut être calculé en multipliant le noyau sur chaque pixel. Cela peut être décrit algorithmiquement par le pseudo-code suivant :

for each image row in input image:
   for each pixel in image row:

      set accumulator to zero

      for each kernel row in kernel:
         for each element in kernel row:

            if element position  corresponding* to pixel position then
               multiply element value  corresponding* to pixel value
               add result to accumulator
            endif

      set output image pixel to accumulator
*les pixels sont retrouvés par rapport à l'origine du noyau

Si le noyau est symétrique, on place le centre (l'origine) du noyau sur le pixel courant ; de ce fait, le noyau chevauchera aussi les pixels voisins. Ensuite, il faudra multiplier les éléments du noyau avec la valeur des pixels qu'il chevauche et ajouter le tout pour obtenir le résultat. La valeur de sortie sera celle du pixel courant qui est à l'origine du noyau.

Si le noyau n'est pas symétrique, il faut retourner par rapport à l'axe horizontal et vertical avant de calculer la convolution comme ci-dessus[1].

Traitement des bords[modifier | modifier le code]

Traitement par extension

Les noyaux de convolution demandent souvent des valeurs à l’extérieur des limites de l'image, il existe plusieurs méthodes pour pallier ce problème.

Extension
Le pixel le plus près du bord est conceptuellement étendu autant que nécessaire pour donner des valeurs pour la convolution. Les pixels en coin sont étendus à 90°, et les autres sont étendus en ligne.
Enroullage (Wrap)
L'image est conceptuellement enroulée, les valeurs sont récupérées des bords opposés.
Miroir
L'image est conceptuellement reflétée sur les bords. Par exemple, pour lire un pixel 3 unité en dehors de l'image, on lit le pixel à 3 unité à l'intérieur de l'image.
Crop
Tout pixel demandant l'utilisation de pixel en dehors de l'image est passé. Cette méthode peut résulter en une image de sortie étant un petit peu plus petite, avec les bords coupés.
Kernel Crop
Tout pixel dans le noyau requérant l'utilisation des pixels en dehors de l'image n'est pas utilisé et la normalisation est ajustée pour compenser.

Normalisation[modifier | modifier le code]

La normalisation est définie comme la division de chaque élément du noyau par la somme de tous les éléments du noyau, donc la somme des éléments d'un noyau normalisé est 1. Cela assure que la moyenne des pixels dans l'image modifiée est aussi lumineuse que dans l'image originale

Notes et références[modifier | modifier le code]

Voir aussi[modifier | modifier le code]

Bibliographie[modifier | modifier le code]

Liens externes[modifier | modifier le code]