# Filtre de Sobel

En traitement d'image , le filtre de Sobel aussi appelé opérateur de Sobel ou opérateur de Sobel-Feldman est un opérateur utilisé pour la détection de contours. L'objectif est de déterminer les contours d'objets dans une image bitmap. Le filtre produit une image où les contours sont mis en exergue. Il s'agit d'un des opérateurs les plus simples qui donne toutefois des résultats corrects.

## Description simplifiée

Pour faire simple, l'opérateur calcule le gradient de l'intensité de chaque pixel. Ceci indique la direction de la plus forte variation du clair au sombre, ainsi que le taux de changement dans cette direction. On connaît alors les points de changement soudain de luminosité, correspondant probablement à des bords, ainsi que l'orientation de ces bords.
En termes mathématiques, le gradient d'une fonction de deux variables (ici l'intensité en fonction des coordonnées de l'image) est un vecteur de dimension 2 dont les coordonnées sont les dérivées selon les directions horizontale et verticale. En chaque point, le gradient pointe dans la direction du plus fort changement d'intensité, et sa longueur représente le taux de variation dans cette direction. Le gradient dans une zone d'intensité constante est donc nul. Au niveau d'un contour, le gradient traverse le contour, des intensités les plus sombres aux intensités les plus claires.

## Formulation

L'opérateur utilise des matrices de convolution. La matrice de taille 3×3 subit une convolution avec l'image pour calculer des approximations des dérivées horizontale et verticale. Soit $\mathbf {A}$ la matrice qui représente l'image source. On calcule $\mathbf {G_{x}}$ et $\mathbf {G_{y}}$ qui sont respectivement deux images qui en chaque point contiennent des approximations de la dérivée horizontale et verticale de chaque point :
    $\mathbf {G_{x}} ={\begin{bmatrix}-1&0&1\\-2&0&2\\-1&0&1\end{bmatrix}}*\mathbf {A} \quad {\mbox{et}}\quad \mathbf {G_{y}} ={\begin{bmatrix}-1&-2&-1\\0&0&0\\1&2&1\end{bmatrix}}*\mathbf {A}$
où * représente l'opération matricielle de convolution.
En chaque point, les approximations des gradients horizontaux et verticaux peuvent être combinées comme suit pour obtenir une approximation de la norme du gradient :
    $\mathbf {G} ={\sqrt {\mathbf {G_{x}} ^{2}+\mathbf {G_{y}} ^{2}}}$
On peut également calculer la direction du gradient en utilisant la fonction atan2 comme suit :
    $\mathbf {\Theta } =\operatorname {atan2} \left({\mathbf {G_{y}} ,\mathbf {G_{x}} }\right)$
Par exemple, $\Theta$ vaut 0 pour un contour vertical plus foncé à gauche.

## Précisions

Puisque l'intensité d'une image numérique est discrète, les dérivées de cette fonction ne peuvent pas être définies si ce n'est sous une hypothèse de continuité de la fonction intensité continue qui a été échantillonnée. En pratique on peut calculer des approximations plus ou moins fidèles du gradient en chaque point.
Le filtre de Sobel calcule une approximation assez inexacte du gradient d'intensité, mais cela suffit en pratique dans beaucoup de cas. En effet, il n'utilise qu'un voisinage (généralement de taille 3×3) autour de chaque point pour calculer le gradient, et les poids utilisés pour le calcul du gradient sont entiers.

## Détails d'implémentation

Du fait de sa simplicité, le filtre de Sobel peut être aisément implémenté de manière logicielle ou même matérielle : seulement huit points autour du point considéré sont nécessaires pour calculer le gradient. Ce calcul utilise simplement des calculs sur les entiers. De plus, les filtres horizontaux et verticaux sont séparables :
    ${\begin{bmatrix}-1&0&+1\\-2&0&+2\\-1&0&+1\end{bmatrix}}={\begin{bmatrix}1\\2\\1\end{bmatrix}}.{\begin{bmatrix}-1&0&+1\end{bmatrix}}\quad \quad {\begin{bmatrix}-1&-2&-1\\0&0&0\\+1&+2&+1\end{bmatrix}}={\begin{bmatrix}-1\\0\\+1\end{bmatrix}}.{\begin{bmatrix}1&2&1\end{bmatrix}}$
et les deux dérivées $\mathbf {G_{x}}$ et $\mathbf {G_{y}}$ peuvent être calculées comme suit :
    $\mathbf {G_{x}} ={\begin{bmatrix}1\\2\\1\end{bmatrix}}.({\begin{bmatrix}-1&0&+1\end{bmatrix}}*\mathbf {A} )\quad {\mbox{et}}\quad \mathbf {G_{y}} ={\begin{bmatrix}-1\\0\\+1\end{bmatrix}}.({\begin{bmatrix}1&2&1\end{bmatrix}}*\mathbf {A} )$
La séparabilité peut être mise à profit dans certains types d'implémentation pour permettre moins d'opérations lors du calcul.
Plus fondamentalement, en divisant par quatre, ces formules montrent que la dérivation dans une direction est associée à un lissage triangulaire dans l'autre direction destiné à éliminer les « faux contours », la même technique étant utilisée dans le filtre de Prewitt avec un lissage rectangulaire qui introduit des changements de phase (voir lissage de l'image).