# Operatore di Sobel

L'operatore di Sobel è un algoritmo usato per elaborare immagini digitali, in particolare per effettuare il riconoscimento dei contorni. Dal punto di vista tecnico è un operatore differenziale, che calcola un valore approssimato del gradiente di una funzione che rappresenta la luminosità dell'immagine. In ogni punto dell'immagine, l'operatore di Sobel può corrispondere al vettore gradiente oppure alla norma di tale vettore. L'algoritmo utilizzato dall'operatore di Sobel è basato sulla convoluzione dell'immagine con un piccolo filtro, separato e di valore intero, applicato sia in direzione verticale che orizzontale, ed è quindi "economico" in termini di potenza di calcolo necessaria. D'altra parte, la precisione con cui è calcolato il gradiente è relativamente bassa, specialmente quando l'immagine è soggetta a variazioni rapide e frequenti.

## Descrizione semplificata

L'operatore calcola il gradiente della luminosità dell'immagine in ciascun punto, trovando la direzione lungo la quale si ha il massimo incremento possibile dal chiaro allo scuro, e la velocità con cui avviene il cambiamento lungo questa direzione. Il risultato ottenuto fornisce una misura di quanto "bruscamente" oppure "gradualmente" l'immagine cambia in quel punto, e quindi della probabilità che quella parte di immagine rappresenti un contorno, e fornisce anche un'indicazione del probabile orientamento di quel contorno. In termini matematici, il gradiente di una funzione di due variabili (qui la funzione luminosità dell'immagine) è in ciascun punto dell'immagine un vettore bidimensionale le cui componenti sono le derivate del valore della luminosità in direzione orizzontale e verticale. In ciascun punto dell'immagine questo vettore gradiente punta nella direzione del massimo possibile aumento di luminosità, e la lunghezza del vettore corrisponde alla rapidità con cui la luminosità cambia spostandosi in quella direzione. Ciò significa che nelle zone dell'immagine in cui la luminosità è costante l'operatore di Sobel ha valore zero, mentre nei punti posti sui contorni è un vettore orientato attraverso il contorno, che punta nella direzione in cui si passa da valori di scuro a valori di chiaro.

## Formulazione matematica

L'operatore applica due kernel 3×3, cioè due matrici di convoluzione all'immagine originaria per calcolare valori approssimati delle derivate - una in direzione orizzontale, ed una in direzione verticale. Se chiamiamo A l'immagine sorgente, e G$_x$ e G$_y$ le due immagini i cui punti rappresentano rispettivamente i valori approssimati delle derivate in orizzontale ed in verticale, l'operazione è descritta da:
    $\mathbf {G} _{x}={\begin{bmatrix}+1&0&-1\\+2&0&-2\\+1&0&-1\end{bmatrix}}*\mathbf {A} \quad {\mbox{e}}\quad \mathbf {G} _{y}={\begin{bmatrix}+1&+2&+1\\0&0&0\\-1&-2&-1\end{bmatrix}}*\mathbf {A}$
dove $*$ indica l'operazione di convoluzione bidimensionale.
La coordinata x è qui considerata positiva quando aumenta in direzione destra, e la coordinata y quando aumenta in direzione verso il basso. In ciascun punto dell'immagine i valori approssimati del gradiente possono essere combinati per calcolare il valore totale del gradiente, usando la formula:
    $\mathbf {G} ={\sqrt {{\mathbf {G} _{x}}^{2}+{\mathbf {G} _{y}}^{2}}}$
Da questi risultati si può ottenere anche la direzione del gradiente:
    $\mathbf {\Theta } =\operatorname {atan2} \left(\mathbf {G} _{y},\mathbf {G} _{x}\right)$
dove, per esempio, $\mathbf {\Theta }$ vale 0 per un contorno verticale più scuro sul lato sinistro (vedi $\operatorname {atan2}$).

## Trattazione più rigorosa

Poiché la funzione che definisce l'intensità luminosa di un'immagine digitale è nota solo in punti discreti, le derivate di questa funzione non possono a rigore essere definite a meno di assumere l'esistenza di una sottostante funzione luminosità continua che sia stata campionata (è da notare che invece fisicamente l'immagine è risultato non tanto di un campionamento ma di una integrazione della luce sul pixel) nei punti dell'immagine. Con alcune altre assunzioni la derivata della funzione luminosità può essere calcolata come funzione dei valori campionati, vale a dire della stessa immagine digitale. Ne consegue che i valori della derivata in ogni punto dell'immagine sono funzioni dei valori della luminosità in quel punto. I valori di questa derivata possono essere calcolati con diversi gradi di precisione.
L'operatore di Sobel fornisce un'approssimazione poco accurata del gradiente dell'immagine, ma è comunque di qualità sufficiente per poter essere utilmente usato in molte applicazioni. Più esattamente, usa i valori di luminosità solo in una regione 3×3 intorno ad ogni punto dell'immagine per calcolare un valore approssimato del gradiente, ed usa soltanto valori interi per i coefficienti che ne pesano la luminosità.

## Dettagli tecnici

Per come è definito, l'operatore di Sobel può essere facilmente implementato sia via hardware che via software: per calcolarne il valore sono necessari soltanto otto punti intorno a ciascun punto dell'immagine, ed il vettore gradiente si calcola con semplici operazioni matematiche su valori interi. Inoltre, i due filtri discreti sopra descritti sono entrambi applicabili separatamente:
    ${\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}}$
e le due derivate G$_x$ e G$_y$ possono quindi essere calcolate come:
    $\mathbf {G} _{x}={\begin{bmatrix}1\\2\\1\end{bmatrix}}*\left({\begin{bmatrix}+1&0&-1\end{bmatrix}}*\mathbf {A} \right)\quad {\mbox{e}}\quad \mathbf {G} _{y}={\begin{bmatrix}+1\\0\\-1\end{bmatrix}}*\left({\begin{bmatrix}1&2&1\end{bmatrix}}*\mathbf {A} \right)$
In alcune implementazioni il calcolo separato può essere vantaggioso perché richiede meno operazioni aritmetiche per ciascun punto dell'immagine.
Poiché l'operatore di Sobel produce una mappa bidimensionale dei gradienti in ciascun punto dell'immagine, questo stesso risultato può essere trattato come un'immagine, in cui le aree ad alto gradiente (cioè i probabili contorni) hanno l'aspetto di linee.