Detector de bordes Canny con Python y OpenCV

Detector de bordes Canny

Canny es un reconocido algoritmo de visión por computador para detección de bordes, lleva su nombre por su desarrollador John F. Canny.

Este Algoritmo se puede usar en openCV mediante la función cv.Canny, internamente esta función realiza las siguientes etapas:

  • Noise Reduction Filtra el ruido en la imagen mediante un filtro gaussiano
  • Finding Intensity Gradient of the Image Encuentra el gradiente. El gradiente define dos valores: la dirección en donde el cambio de intensidad es máximo y la magnitud de esa dirección1
Representación intuitiva de los gradientes en una imagen en escala de grises
  • Non-maximum Suppression Después de obtener la magnitud y la dirección del degradado, se realiza un escaneo completo de la imagen para eliminar los píxeles no deseados que pueden no constituir el borde. Esto elimina los píxeles que no se consideran parte de un borde. Por lo tanto, solo quedarán líneas finas (bordes candidatos).
  • Hysteresis Thresholding Esta etapa decide cuáles son los bordes que son realmente bordes y cuáles no. Para esto, necesitamos dos valores de umbral, minVal y maxVal.

Los bordes con un gradiente de intensidad superior a maxVal seguramente serán bordes y aquellos por debajo de minVal probablemente no serán bordes, por lo que se descartan. Aquellos que se encuentran entre estos dos umbrales se clasifican como bordes o no bordes en función de su conectividad. Si están conectados a píxeles de “borde seguro”, se consideran parte de los bordes. De lo contrario, también se descartan2.

Canny en una imagen

Los parámetros de cv2.Canny son los siguientes:

  1. image es la imagen en escala de gris que va a ser analizada
  2. minValmaxVal son los umbrales para que el algoritmo en la etapa Hysteresis Thresholding decida cuales son contornos
cv2.Canny(image, minVal, maxVal)

Usaremos la imagen a continuación para aplicar el detector Canny.

El código es el siguiente:

import cv2

img = cv2.imread('taza.png')
bordesCanny = cv2.Canny(img,100,200)

cv2.imshow('Img', img)
cv2.imshow('Canny - vMin =100 vMax = 200', bordesCanny)

cv2.waitKey(0)
cv2.destroyAllWindows()

Canny en un video

En esta parte usaremos el código de un post anterior Acceder a la Web Cam, y añadiremos la función cv2.Canny

import cv2

capture = cv2.VideoCapture(0)

while (capture.isOpened()):
    ret, frame = capture.read()
    if (ret == True):
        #Aplicar Canny a frame
        bordesCanny = cv2.Canny(frame, 100, 200)
        #Mostrar Ventanas
        cv2.imshow("Ventana", frame)
        cv2.imshow("Canny", bordesCanny)

        if (cv2.waitKey(1) == ord('s')):
            break
    else:
        break

capture.release()
cv2.destroyAllWindows()

El resultado será el siguiente:

Suavizar Canny

En el siguiente código añado un filtro blur antes de aplicar Canny y el resultado es que el filtro suaviza la imagen y se muestran menos bordes pequeños no deseados.

import cv2

capture = cv2.VideoCapture(0)

while (capture.isOpened()):
    ret, frame = capture.read()
    if (ret == True):
        # Aplicar blur a frame
        blur = cv2.blur(frame, (5, 5))
        # Aplicar Canny a frame
        bordesCanny = cv2.Canny(frame, 100, 200)
        CannyBlur = cv2.Canny(blur, 100, 200)

        # Mostrar Ventanas
        cv2.imshow("Ventana", frame)
        cv2.imshow("Canny", bordesCanny)
        cv2.imshow("CannyBlur", CannyBlur)

        if (cv2.waitKey(1) == ord('s')):
            break
    else:
        break

capture.release()
cv2.destroyAllWindows()

El resultado es el siguiente:

Canny con trackbars

En el siguiente video explicamos como visualizar Canny variando los valores máximos y mínimos con un trackbar.

Referencias

  1. Histograma de gradientes orientados (HOG). Disponible en: programadorclic 
  2. Canny Edge Detection. Disponible en: OpenCV Open Source Computer Vision

1 comentario en “Detector de bordes Canny con Python y OpenCV”

  1. Pingback: Añadir trackBar en openCV y python - Kipuna Ec

Deja un comentario

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