El operador de Sobel es un operador diferencial discreto que calcula el valor aproximado del gradiente de brillo de la imagen . El resultado de aplicar el operador de Sobel en cada punto de la imagen es el vector del gradiente de brillo en ese punto o su norma . Utilizado en el campo del procesamiento de imágenes , en particular, se usa a menudo en algoritmos de detección de bordes .
El operador de Sobel se basa en la convolución de una imagen mediante pequeños filtros de enteros separables en las direcciones vertical y horizontal, por lo que es relativamente fácil de calcular. Por otro lado, la aproximación de gradiente que utiliza es bastante tosca, especialmente para las oscilaciones de imagen de alta frecuencia.
El operador calcula el gradiente de brillo de la imagen en cada punto. Así es como se encuentra la dirección del mayor aumento de brillo y la magnitud de su cambio en esta dirección. El resultado muestra cuán "bruscamente" o "suavemente" cambia el brillo de la imagen en cada punto y, por lo tanto, la probabilidad de encontrar un punto en el borde, así como la orientación del borde. En la práctica, calcular la magnitud del cambio de brillo (probabilidad de pertenecer a una cara) es más fiable y fácil de interpretar que calcular la dirección.
Matemáticamente, el gradiente de la función de dos variables para cada punto de la imagen (que es la función de brillo) es un vector bidimensional cuyas componentes son las derivadas horizontal y vertical del brillo de la imagen. En cada punto de la imagen, el vector de gradiente está orientado en la dirección del mayor aumento de brillo y su longitud corresponde a la cantidad de cambio en el brillo. Esto significa que el resultado del operador de Sobel en un punto que se encuentra en una región de brillo constante será un vector cero , y en un punto que se encuentra en el borde de las regiones de brillo diferente, un vector que cruza el borde en la dirección de brillo creciente .
En sentido estricto, el operador utiliza núcleos con los que se convoluciona la imagen original para calcular los valores aproximados de las derivadas horizontal y vertical. Sean la imagen original, y y dos imágenes en las que cada punto contiene derivadas aproximadas con respecto a y con respecto a . Se calculan de la siguiente manera:
donde denota una operación de convolución bidimensional.
La coordenada aquí aumenta "a la derecha" y - "abajo". En cada punto de la imagen, el valor aproximado del valor del gradiente se puede calcular utilizando los valores aproximados obtenidos de las derivadas:
(es decir, elemento por elemento).Usando esta información, también podemos calcular la dirección del gradiente:
,donde, por ejemplo, el ángulo Θ es cero para un borde vertical que tiene un lado oscuro a la izquierda.
Dado que la función de brillo solo se conoce en puntos discretos, no podemos determinar las derivadas hasta que establezcamos que el brillo es una función diferenciable que pasa por estos puntos. Con esta premisa adicional, la derivada de la función de brillo diferenciable se puede calcular a partir de la función a partir de la cual se toman las medidas, los puntos de la imagen. Resulta que las derivadas en cualquier punto individual son funciones del brillo de todos los puntos de la imagen. Sin embargo, las aproximaciones de sus derivadas se pueden determinar con mayor o menor grado de precisión.
El operador de Sobel es una aproximación más imprecisa del gradiente de la imagen, pero tiene suficiente calidad para aplicaciones prácticas en muchos problemas. Más precisamente, el operador solo usa los valores de intensidad en la vecindad de cada píxel para obtener una aproximación del gradiente de imagen correspondiente, y usa solo valores de peso de luminancia enteros para estimar el gradiente.
El operador Sobel consiste en dos operaciones separadas [1] :
Fórmulas de filtro de Sobel para derivados de imágenes en diferentes espacios para :
Aquí hay un ejemplo de un núcleo Sobel tridimensional para el eje :
.Como se desprende de la definición, el operador de Sobel se puede implementar con herramientas técnicas y de software simples: para aproximar el vector de gradiente, solo se necesitan ocho píxeles alrededor del punto de la imagen y la aritmética de números enteros. Además, los dos filtros discretos descritos anteriormente se pueden separar:
y dos derivadas, y , ahora se pueden calcular como
La separación de estos cálculos puede dar lugar a una reducción de las operaciones aritméticas con cada píxel.
La aplicación de una convolución a un grupo de píxeles se puede representar mediante un pseudocódigo :
N(x, y) = Suma { K(i, j).P(xi, yj)}, para i, j de −1 a 1.
N(x, y) es el resultado de aplicar la matriz de convolución K a P.
La implementación del software del operador Sobel puede usar efectivamente las extensiones SIMD del conjunto de instrucciones de los procesadores modernos (la llamada vectorización de código), mientras que la ganancia en la velocidad de cálculo del operador puede ser hasta cinco veces en comparación con un alto implementación de nivel [2] . La codificación manual en lenguaje ensamblador le permite superar en velocidad a compiladores como Microsoft Visual C++ e Intel C++ Compiler .
El cálculo del operador Sobel simplemente se paraleliza en un número arbitrario de subprocesos (en el límite, cada punto de la imagen resultante se puede calcular independientemente de sus vecinos). Por ejemplo, si hay dos procesadores ( cores ), el medio cuadro superior de la imagen puede ser procesado por uno de ellos y el inferior por el otro.
El resultado de aplicar el operador de Sobel es un mapa de gradiente bidimensional para cada punto. Puede procesarse y mostrarse como una imagen, en la que las áreas con un gran valor de gradiente (principalmente los bordes) serán visibles como líneas blancas. Las imágenes a continuación ilustran esto con una imagen simple como ejemplo:
El operador de Sobel suaviza los efectos espurios en la imagen causados por un operador diferencial puramente central , pero no tiene una simetría rotacional completa . Scharr investigó la mejora de esta propiedad y llegó a la conclusión de que el siguiente kernel ofrece los mejores resultados [3] [4] :