Operadores de detección de bordes (Sobel y Prewitt)

Los filtros de detección de contornos de Sobel y Prewitt están basados en el producto de convolución con las siguientes máscaras:

Sobel
Prewitt

gx=[121000121]gy=[101202101 ]g_x = \begin{bmatrix} -1 & -2 & -1\\ 0 & 0 & 0\\ 1 & 2 & 1\\ \end{bmatrix} \\[4ex] g_y= \begin{bmatrix} -1 & 0 & 1\\ -2 & 0 & 2\\ -1 & 0 & 1\ \end{bmatrix}

gx=[111000111]gy=[101101101 ]g_x = \begin{bmatrix} -1 & -1 & -1\\ 0 & 0 & 0\\ 1 & 1 & 1\\ \end{bmatrix} \\[4ex] g_y= \begin{bmatrix} -1 & 0 & 1\\ -1 & 0 & 1\\ -1 & 0 & 1\ \end{bmatrix}

M(x,y)=ggx+gyM(x,y) = ||g|| \approx |g_x|+|g_y|

M(x,y)=ggx+gyM(x,y) = ||g|| \approx |g_x|+|g_y|

Es importante notar que cada máscara de estos dos filtros efectúa un suavizado en la dirección perpendicular a la cual calcula la derivada parcial. Prewitt utiliza para esto un filtro promedio , mientras que Sobel utiliza un filtro gaussiano.

Para aplicar el operador sobre una imagen dada de Sobel podemos usar scikit-image de la siguiente manera:


from skimage.filters import sobel_h, sobel_v, sobel

#Aplica el filtro Sobel horizontal
img_sh = sobel_h(imagen)
#Aplica el filtro Sobel vertical
img_sv = sobel_v(imagen)
#Calcula bordes usando el filtro de sobel
img_s = sobel(imagen)

Para aplicar el operador sobre una imagen dada de Prewitt podemos usar scikit-image de la siguiente manera:

from skimage.filters import prewitt_h, prewitt_v, prewitt

#Aplica el filtro Sobel horizontal
img_sh = prewitt_h(imagen)
#Aplica el filtro Sobel vertical
img_sv = prewitt_v(imagen)
#Calcula bordes usando el filtro de sobel
img_s = prewitt(imagen)

En ambos casos recuerde validar los valores de salida de sus imágenes para poder visualizar correctamente los bordes calculados.

Last updated