# Operador Sobel

El operador Sobel es utilizado en procesamiento de imágenes, especialmente en algoritmos de detección de bordes. Técnicamente es un operador diferencial discreto que calcula una aproximación al gradiente de la función de intensidad de una imagen. Para cada punto de la imagen a procesar, el resultado del operador Sobel es tanto el vector gradiente correspondiente como la norma de este vector.

## Descripción simple

El operador Sobel calcula el gradiente de la intensidad de una imagen en cada punto (píxel). Así, para cada punto, este operador da la magnitud del mayor cambio posible, la dirección de este y el sentido desde oscuro a claro. El resultado muestra cómo de abruptamente o suavemente cambia una imagen en cada punto analizado y, en consecuencia, cuán probable es que este represente un borde en la imagen y, también, la orientación a la que tiende ese borde. En la práctica, el cálculo de la magnitud -probabilidad de un borde- es más fiable y sencillo de interpretar que el cálculo de la dirección y sentido.
Matemáticamente, el gradiente de una función de dos variables (en este caso, la función de intensidad de la imagen) para cada punto es un vector bidimensional cuyos componentes están dados por las primeras derivadas de las direcciones verticales y horizontales. Para cada punto de la imagen, el vector gradiente apunta en dirección del incremento máximo posible de la intensidad, y la magnitud del vector gradiente corresponde a la cantidad de cambio de la intensidad en esa dirección.
Lo dicho en los párrafos anteriores implica que el resultado de aplicar el operador Sobel sobre una región con intensidad de imagen constante es un vector cero, y el resultado de aplicarlo en un punto sobre un borde es un vector que cruza el borde (perpendicular) cuyo sentido es de los puntos más oscuros a los más claros.

## Formulación

Matemáticamente, el operador utiliza dos kernels de 3×3 elementos para aplicar convolución a la imagen original para calcular aproximaciones a las derivadas, un kernel para los cambios horizontales y otro para las verticales. Si definimos $\mathbf {A}$ como la imagen original, el resultado, que son las dos imágenes $\mathbf {G_{x}}$ y $\mathbf {G_{y}}$ que representan para cada punto las aproximaciones horizontal y vertical de las derivadas de intensidades, es calculado como:
    $\mathbf {G_{x}} ={\begin{bmatrix}-1&0&+1\\-2&0&+2\\-1&0&+1\end{bmatrix}}*\mathbf {A} \quad {\mbox{y}}\quad \mathbf {G_{y}} ={\begin{bmatrix}-1&-2&-1\\0&0&0\\+1&+2&+1\end{bmatrix}}*\mathbf {A}$
En cada punto de la imagen, los resultados de las aproximaciones de los gradientes horizontal y vertical pueden ser combinados para obtener la magnitud del gradiente, mediante:
    $\mathbf {G} ={\sqrt {\mathbf {G_{x}} ^{2}+\mathbf {G_{y}} ^{2}}}$
Con esta información, podemos calcular también la dirección del gradiente:
    $\mathbf {\Theta } =\operatorname {atan2} \left(\mathbf {G_{y}} ,\mathbf {G_{x}} \right)$
donde, por ejemplo, $\Theta$ es 0 para bordes verticales con puntos más oscuros al lado izquierdo.

## Formalmente

Debido a que la función de intensidad de una imagen digital solo se conoce mediante puntos discretos, las derivadas de estas funciones no pueden ser definidas a menos que asumamos que existe una función continua que ha sido muestreada en los puntos de la imagen. Con algunas suposiciones adicionales, la derivada de la función continua de intensidad puede ser calculada como una función de la función de intensidad muestreada, i.e, de la imagen digital. De lo anterior resulta que las derivadas en cualquier punto particular son funciones de los valores de intensidad, virtualmente, en todos los puntos de la imagen. Sin embargo, aproximaciones a estas funciones diferenciales pueden ser definidas con el nivel de precisión requerido teniendo en cuenta únicamente una pequeña región de puntos alrededor del estudiado.
El operador sobel representa una primera aproximación imprecisa del gradiente de la imagen, pero es de calidad suficiente para ser de uso práctico en muchas aplicaciones. Más precisamente, éste operador utiliza solo valores de intensidad en una región de 3x3 alrededor de cada punto analizado para calcular el gradiente correspondiente, además de que utiliza solo números enteros para los coeficientes que indican la aproximación del gradiente.

## Detalles técnicos

Como una consecuencia de su definición, el operador sobel puede ser implementado mediante simples definiciones tanto en hardware como en software: solo son utilizados ocho puntos de la imagen alrededor del punto a analizar para calcular el punto correspondiente de la imagen resultante, además solo se requiere aritmética con números enteros para calcular una aproximación del vector gradiente. Además, los dos filtros discretos descritos arriba pueden ser separados:
    ${\begin{bmatrix}-1&0&+1\\-2&0&+2\\-1&0&+1\end{bmatrix}}={\begin{bmatrix}1\\2\\1\end{bmatrix}}\times {\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}}\times {\begin{bmatrix}1&2&1\end{bmatrix}}$
y las dos derivadas $\mathbf {G_{x}}$ y $\mathbf {G_{y}}$ pueden ser calculadas con:
    $\mathbf {G_{x}} ={\begin{bmatrix}1\\2\\1\end{bmatrix}}\times {\begin{bmatrix}-1&0&+1\end{bmatrix}}*\mathbf {A} \quad {\mbox{y}}\quad \mathbf {G_{y}} ={\begin{bmatrix}-1\\0\\+1\end{bmatrix}}\times {\begin{bmatrix}1&2&1\end{bmatrix}}*\mathbf {A}$
En ciertas implementaciones, estos cálculos separados dan buena ventaja ya que implican menor operaciones aritméticas para cada punto.

## Ejemplo

Ya que el resultado del operador sobel es un mapeo de dos dimensiones del gradiente de cada punto, éste puede ser procesado y ser visto como una imagen, con las áreas de gradiente elevado (equivalentes a bordes) en negro y con los demás como blanco (el fondo de la imagen generada). Las siguientes imágenes ilustran lo anterior, se muestra el cálculo del operador sobel sobre una imagen. Obsérvese las diferencias de gradiente (zonas negras) dadas al aplicar únicamente un gradiente.
| Imagen original en escala de grises. | Imagen resultante del gradiente calculado por el operador Sobel sobre la imagen original. |
| Cálculo del gradiente X con el operador Sobel. | Cálculo del gradiente Y con el operador Sobel. |