Programa Python para detectar los bordes de una imagen usando OpenCV | Método de detección de bordes Sobel

El siguiente programa detecta los bordes de los cuadros en un contenido de video en vivo. El código solo se compilará en un entorno Linux. Asegúrese de que openCV esté instalado en su sistema antes de ejecutar el programa.
Pasos para descargar los requisitos a continuación: 
 

  • Ejecute el siguiente comando en su terminal para instalarlo desde el repositorio de Ubuntu o Debian. 
     
sudo apt-get install libopencv-dev python-opencv
  •  
  • O Para descargar OpenCV desde el sitio oficial, ejecute el siguiente comando: 
     
bash install-opencv.sh
  • en tu terminal.
  • Escriba su contraseña de sudo y habrá instalado OpenCV.

Principio detrás de la detección de bordes 

La detección de bordes involucra métodos matemáticos para encontrar puntos en una imagen donde el brillo de las intensidades de los píxeles cambia claramente. 
 

  • Lo primero que vamos a hacer es encontrar el degradado de la imagen en escala de grises, lo que nos permitirá encontrar regiones similares a bordes en la dirección x e y. El gradiente es una generalización multivariable de la derivada. Mientras que una derivada se puede definir en funciones de una sola variable, para funciones de varias variables, el gradiente toma su lugar.
  • El gradiente es una función de valor vectorial, a diferencia de una derivada, que tiene un valor escalar. Al igual que la derivada, el gradiente representa la pendiente de la tangente de la gráfica de la función . Más precisamente, el gradiente apunta en la dirección de la mayor tasa de aumento de la función, y su magnitud es la pendiente de la gráfica en esa dirección.

Nota: En visión artificial, la transición de negro a blanco se considera una pendiente positiva, mientras que la transición de blanco a negro es una pendiente negativa.
 

Python

# Python program to  Edge detection
# using OpenCV in Python
# using Sobel edge detection
# and laplacian method
import cv2
import numpy as np
 
#Capture livestream video content from camera 0
cap = cv2.VideoCapture(0)
 
while(1):
 
    # Take each frame
    _, frame = cap.read()
     
    # Convert to HSV for simpler calculations
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
     
    # Calculation of Sobelx
    sobelx = cv2.Sobel(frame,cv2.CV_64F,1,0,ksize=5)
     
    # Calculation of Sobely
    sobely = cv2.Sobel(frame,cv2.CV_64F,0,1,ksize=5)
     
    # Calculation of Laplacian
    laplacian = cv2.Laplacian(frame,cv2.CV_64F)
     
    cv2.imshow('sobelx',sobelx)
    cv2.imshow('sobely',sobely)
    cv2.imshow('laplacian',laplacian)
    k = cv2.waitKey(5) & 0xFF
    if k == 27:
        break
 
cv2.destroyAllWindows()
 
#release the frame
cap.release()

Cálculo de la derivada de una imagen

Una imagen digital está representada por una array que almacena el valor RGB/BGR/HSV (cualquiera que sea el espacio de color al que pertenezca la imagen) de cada píxel en filas y columnas. 
La derivada de una array se calcula mediante un operador llamado laplaciano . Para calcular un Laplaciano, deberá calcular las dos primeras derivadas, llamadas derivadas de Sobel , cada una de las cuales tiene en cuenta las variaciones de gradiente en una dirección determinada: una horizontal y la otra vertical. 
 

  • Derivada de Sobel horizontal (Sobel x) : Se obtiene mediante la convolución de la imagen con una array llamada kernel que siempre tiene tamaño impar. El núcleo con tamaño 3 es el caso más simple.
  • Derivada vertical de Sobel (Sobel y) : Se obtiene mediante la convolución de la imagen con una array llamada kernel que siempre tiene tamaño impar. El núcleo con tamaño 3 es el caso más simple.
  • La convolución se calcula mediante el siguiente método: la imagen representa la array de la imagen original y el filtro es la array del núcleo.
     

Convolving an image with a kernel

  • Factor = 11 – 2- 2- 2- 2- 2 = 3 
    Compensación = 0
    Suma ponderada = 124*0 + 19*(-2) + 110*(-2) + 53*11 + 44*(-2) + 19*0 + 60*(-2) + 100*0 = 117 
    O[4,2] = (117/3) + 0 = 39
    Entonces, al final, para obtener la (aproximación) laplaciana, necesitaremos combinar los dos resultados anteriores (Sobelx y Sobely) y almacenarlo en laplacian.

Parámetros: 
 

  • cv2.Sobel(): La función cv2.Sobel(frame,cv2.CV_64F,1,0,ksize=5) se puede escribir como
cv2.Sobel(original_image,ddepth,xorder,yorder,kernelsize)
  • donde el primer parámetro es la imagen original, el segundo parámetro es la profundidad de la imagen de destino. Cuando d depth=-1/CV_64F, la imagen de destino tendrá la misma profundidad que la fuente. El tercer parámetro es el orden de la derivada x. El cuarto parámetro es el orden de la derivada y. Al calcular Sobelx, estableceremos xorder como 1 y yorder como 0, mientras que al calcular Sobely, se invertirá el caso. El último parámetro es el tamaño del núcleo Sobel extendido; debe ser 1, 3, 5 o 7.
  • cv2.Laplacian : En la función
cv2.Laplacian(frame,cv2.CV_64F)
  • el primer parámetro es la imagen original y el segundo parámetro es la profundidad de la imagen de destino. Cuando profundidad=-1/CV_64F, la imagen de destino tendrá la misma profundidad que la fuente.

Aplicaciones de detección de bordes

  • Reduzca la información innecesaria en una imagen mientras preserva la estructura de la imagen.
  • Extraiga características importantes de la imagen como curvas, esquinas y líneas.
  • Reconoce objetos, límites y segmentación.
  • Desempeña un papel importante en la visión y el reconocimiento por computadora.

Artículo relacionado: Detección de bordes usando el método de detección de bordes Canny 
Este artículo es una contribución de Pratima Upadhyay . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *