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 gaussianoFinding 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
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
ymaxVal
.
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:
image
es la imagen en escala de gris que va a ser analizadaminVal
,maxVal
son los umbrales para que el algoritmo en la etapaHysteresis 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
- Histograma de gradientes orientados (HOG). Disponible en: programadorclic
- Canny Edge Detection. Disponible en: OpenCV Open Source Computer Vision
Pingback: Añadir trackBar en openCV y python - Kipuna Ec