Función OpenCV sobel()

Manav Narula 30 enero 2023
  1. Detección de bordes usando la función Sobel() usando OpenCV en Python
  2. Conclusión
Función OpenCV sobel()

Usando la biblioteca OpenCV, podemos procesar y aplicar varias técnicas a las imágenes. Tales procesos forman una parte integral de las tareas complicadas de Computer Vision, y una de esas tareas es la detección de bordes en imágenes.

Los bordes son los límites o contornos de los objetos en una imagen y están asociados con cambios muy altos en la densidad de píxeles. Al comparar la densidad de los píxeles vecinos, podemos detectar bordes.

Hay varios algoritmos disponibles para la detección de bordes y se aplican en la biblioteca OpenCV. Una de estas técnicas es el algoritmo de detección de bordes de Sobel.

Este tutorial demostrará el algoritmo de Sobel usando OpenCV en Python.

Detección de bordes usando la función Sobel() usando OpenCV en Python

El algoritmo de detección de bordes de Sobel utiliza el gradiente de la imagen para predecir y encontrar los bordes de una imagen. Comparamos la densidad de píxeles para detectar bordes usando este algoritmo.

Calculamos la primera derivada de la función para encontrar los puntos máximos. A continuación, se comparan con el valor umbral.

En esta técnica, el operador de Sobel calcula el gradiente de la función. Combina el suavizado y la diferenciación gaussiana.

En general, usamos kernels para suavizar o difuminar una imagen, pero en este caso, los usaremos para calcular los degradados. Las derivadas se calculan a lo largo de los ejes x e y.

El gradiente en un punto dado se calcula usando estos dos valores. Este valor de gradiente es menos propenso al ruido y luego se usa para la detección de bordes.

La biblioteca OpenCV implementa esto usando la función Sobel(). Necesitamos especificar la función con varios parámetros junto con la imagen.

Necesitamos mencionar la profundidad de la imagen final, especificada con el parámetro ddepth. Con el valor de -1, la imagen de salida tendrá la misma profundidad que la imagen de entrada.

El orden de las derivadas a utilizar se especifica mediante los parámetros dx y dy. El tamaño del núcleo Sobel extendido se menciona mediante el parámetro ksize.

Los parámetros escala y delta son opcionales. Veamos ahora un ejemplo.

import cv2

i = cv2.imread("deftstack.png")
img = cv2.GaussianBlur(i, (3, 3), sigmaX=0, sigmaY=0)

edge_sobel = cv2.Sobel(src=img, ddepth=cv2.CV_64F, dx=1, dy=1, ksize=5)

cv2.imshow("Output", edge_sobel)
cv2.waitKey(0)
cv2.destroyAllWindows()

Producción:

Detección de bordes usando Sobel a lo largo de los ejes X e Y

En el ejemplo anterior, usamos la función Sobel(). Calculamos la derivada de primer orden a lo largo de los ejes x e y y obtuvimos el gradiente, que luego se usa para encontrar los contornos.

La imagen final es de 64 bits, tal y como se especifica en el parámetro ddepth. El núcleo utilizado es de tamaño 5x5.

Tenga en cuenta la función GaussianBlur(); se usa para desenfocar una imagen dada, y un operador Sobel funciona mejor en imágenes borrosas. Las funciones waitKey() y destroyAllWindows() evitan que se cierre la ventana de salida y esperan a que el usuario pulse alguna tecla para salir.

Como se discutió, calculamos la derivada a lo largo de los ejes x e y en el ejemplo anterior. También podemos calcular la derivada a lo largo de cualquiera de los ejes poniendo la derivada del otro como 0.

Por ejemplo,

import cv2

i = cv2.imread("deftstack.png")
img = cv2.GaussianBlur(i, (3, 3), sigmaX=0, sigmaY=0)

edge_sobel = cv2.Sobel(src=img, ddepth=cv2.CV_64F, dx=1, dy=0, ksize=5)

cv2.imshow("Output", edge_sobel)
cv2.waitKey(0)
cv2.destroyAllWindows()

Producción:

Detección de bordes usando Sobel a lo largo del eje X

En el código anterior, calculamos la derivada solo a lo largo de la dirección horizontal y ponemos el valor del parámetro dy en 0. Para calcular la derivada verticalmente, ponemos el parámetro dx en 0.

Tenga en cuenta que en nuestros ejemplos, usamos el tamaño del núcleo como 5x5. También podemos usar el tamaño 3x3, pero el resultado contiene muchas imprecisiones en este caso y no es recomendable.

El filtro de Scharr es otro operador similar a Sobel y se puede utilizar en casos de 3x3.

Conclusión

Este tutorial ha demostrado el uso de la función Sobel() de la biblioteca OpenCV. Primero comenzamos por comprender el algoritmo de Sobel para la detección de bordes.

Entendimos los conceptos básicos de los gradientes de imagen y cómo el operador Sobel los calcula de manera eficiente. En el artículo se muestran ejemplos de diferentes situaciones.

También se discute la desventaja de usar un kernel 3x3, y su alternativa, el filtro Scharr, puede usarse para proporcionar mejores resultados en este caso.

Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn

Artículo relacionado - Python OpenCV

Artículo relacionado - OpenCV Image