Detección de bordes
Todo el código de ejemplo se encuentra en Google Colab para su ejecución directa. Si no puedes ejecutar OpenCV localmente, puedes usar Google Colab junto con matplotlib para visualizar imágenes. Además la imagen que se utilizará en los ejemplos son imagen.png.
Objetivo
- Aprender los principales métodos de detección de bordes en imágenes.
- Comprender cómo se identifican los cambios bruscos de intensidad mediante gradientes, supresión de no-máximos y umbralización con histéresis.
- Aplicar el algoritmo de Canny en OpenCV para resaltar contornos y preparar imágenes para análisis, segmentación y reconocimiento de objetos.
Conceptos clave
- Bordes: Regiones de una imagen donde la intensidad cambia abruptamente. Representan contornos de objetos.
- Gradiente: Medida de cambio de intensidad en la imagen; indica dirección y magnitud del borde.
- Supresión de no-máximos: Técnica para mantener solo los píxeles locales máximos en la dirección del gradiente, afinando los bordes.
- Umbralización con histéresis: Clasificación de bordes en fuertes, débiles o descartados según dos valores umbral y su conectividad.
- Filtros de suavizado: Reducen el ruido en la imagen antes de calcular gradientes.
Funciones principales en OpenCV
cv.Canny(image, threshold1, threshold2)
: Detecta bordes usando el algoritmo de Canny.
Teoría
- Reducción de ruido: Se aplica un filtro Gaussiano (generalmente 5x5) para suavizar la imagen y eliminar ruido que podría generar falsos bordes.
- Cálculo del gradiente de intensidad: Se aplican filtros Sobel en direcciones horizontal y vertical para obtener las derivadas parciales. A partir de estas, se calcula la magnitud y dirección del gradiente. La dirección del gradiente es perpendicular al borde.
- Supresión de no-máximos: Se revisa cada píxel para determinar si es un máximo local en la dirección del gradiente. Si no lo es, se descarta (valor 0). Esto produce bordes delgados y precisos.
- Umbralización con histéresis: Se usan dos umbrales (
minVal
ymaxVal
). Píxeles con gradiente mayor quemaxVal
son bordes seguros. Píxeles por debajo deminVal
se descartan. Los píxeles intermedios se consideran bordes solo si están conectados a un borde seguro, eliminando así ruido adicional y fragmentos aislados.
El resultado final es una imagen binaria con bordes fuertes y definidos, lista para su análisis posterior.

Figura 1: Imagen original vs. Canny.
Detección de bordes con Canny
La detección de bordes con el algoritmo de Canny es uno de los métodos más utilizados en visión por computadora por su capacidad de encontrar bordes finos y precisos, minimizando el ruido y las faltas detecciones. Este algoritmo es especialmente útil cuando se requiere identificar contornos claros de objetos dentro de una imagen, ya que combina suavizado, cálculo de gradientes, supresión de no-máximos y umbralización con hitéresis para generar bordes continuos y delgados.
Usos comunes de la detección de bordes con Canny:
- Reconocimiento de objetos: Delimita la forma de los objetos para su posterior clasificación o seguimiento.
- Segmentación de imágenes: Ayuda a separar regiones de interés basándose en los contornos.
- Visión robótica: Permite a robots detectar obstáculos y bordes de superficies.
- Procesamiento de documentos: Localiza bordes de texto o figuras para OCR y análisis de formas.
- Análisis médico: Detecta estructuras en imágenes de radiografías, resonancias o ultrasonidos.
- Python (PC con entorno gráfico)
- Python (Google Colab)
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('imagen.jpg', cv.IMREAD_GRAYSCALE)
edges = cv.Canny(img,100,200)
plt.subplot(121),plt.imshow(img,cmap = 'gray')
plt.title('Imagen original'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(edges,cmap = 'gray')
plt.title('Imagen con detección de bordes'), plt.xticks([]), plt.yticks([])
plt.show()
import cv2 as cv
import matplotlib.pyplot as plt
from google.colab import files
# Subir archivo desde tu PC
uploaded = files.upload()
filename = list(uploaded.keys())[0]
img = cv.imread(filename, cv.IMREAD_GRAYSCALE)
edges = cv.Canny(img,100,200)
plt.subplot(121),plt.imshow(img,cmap = 'gray')
plt.title('Imagen original'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(edges,cmap = 'gray')
plt.title('Imagen con detección de bordes'), plt.xticks([]), plt.yticks([])
plt.show()