¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Cómo se detectan los bordes de una imagen

Después de esta lección: Puedo encontrar los bordes de una imagen midiendo el cambio entre píxeles vecinos.

Lección de 75 min3 comandosLaboratorio de visión por computador: píxeles, umbrales y recuento de objetos en JupyterLab

Un borde es un cambio brusco de brillo

Un borde de una imagen es el lugar donde el brillo cambia de golpe, como el contorno de una moneda sobre una mesa. Detectar bordes permite encontrar formas, medir objetos y leer las líneas de una carretera.

Hoy mides el cambio entre píxeles vecinos y construyes un mapa de bordes con números.

Al final de esta lección

Nota

Puedo encontrar los bordes de una imagen midiendo el cambio entre píxeles vecinos.

Palabras clave

PalabraQué significa
Bordeun cambio brusco de brillo entre vecinos
Gradientecuánto cambia el brillo de un píxel al siguiente
Intensidad del bordeel tamaño del cambio, sin signo
Mapa de bordesuna máscara con 1 donde hay borde
Cannyun detector de bordes que adelgaza las líneas

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

El gradiente es la diferencia con el vecino

Para saber si hay un borde, resta el brillo de un píxel al del siguiente. Esa diferencia es el gradiente.

En una zona lisa, la diferencia es 0. En un borde, es un número grande. El signo dice la dirección: positivo si el brillo sube y negativo si baja.

Ejemplo resuelto: el gradiente de una fila

PíxelSiguienteDiferenciaQué indica
10100Zona lisa
10100Zona lisa
10200190Borde: el brillo sube
2002000Zona lisa
2002000Zona lisa

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

El gradiente de una fila

Código: python
# Una fila de brillos: oscuro a la izquierda y claro a la derecha.
row = [10, 10, 10, 200, 200, 200]
differences = []
for n in range(len(row) - 1):
    differences.append(row[n + 1] - row[n])
print("diferencias:", differences)
# Cambia row a [200, 200, 10, 10]. ¿Qué signo tiene ahora la diferencia del borde?

Un error muy común

Advertencia

Mucha gente cree que un borde es una línea oscura. Un borde es un cambio, y puede ir de oscuro a claro o de claro a oscuro. Por eso se mide el tamaño de la diferencia sin su signo, con abs. Una zona oscura y lisa no tiene bordes.

La intensidad suma los dos cambios

Una imagen cambia hacia la derecha y hacia abajo. En cada píxel se calculan dos diferencias: gx, con el vecino de la derecha, y gy, con el de abajo.

La intensidad del borde es abs(gx) + abs(gy). Si pasa de un límite que eliges, el píxel es de borde y vale 1 en el mapa de bordes.

La intensidad de un salto de 190

Comando
docker exec jupyter python3 -c "print(abs(10 - 200) + abs(10 - 10))"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Ejemplo resuelto: un borde vertical

Posición (fila, columna)gxgyIntensidadBorde con límite 100
(0, 0)0000
(0, 1)19001901
(1, 0)0000
(1, 1)19001901

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Qué cuenta el script de bordes del laboratorio

El script edges.py usa el detector de Canny de scikit-image sobre shapes.png, una imagen de formas de colores. Canny desenfoca primero, mide el gradiente y adelgaza las líneas hasta dejarlas de un píxel.

Imprime en inglés: picture pixels son los píxeles de la imagen y edge pixels los de borde. Salen 60.000 y 1.326, poco más del 2 por ciento.

Busca los bordes de las formas

Comando
docker exec jupyter python3 steps/edges.py

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Qué parte de la imagen es borde

Comando
docker exec jupyter python3 -c "print(1326 * 100 // 60000)"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

El ruido crea bordes falsos

Una mota es un cambio brusco, así que un detector la marca como borde. Por eso Canny desenfoca antes de medir.

La medida de hoy es más simple que Canny: no desenfoca ni adelgaza. Sirve para entender la idea, y con una imagen limpia da un buen mapa.

Para ir más lejos: la carretera

Abre road.png en JupyterLab. Tiene dos líneas blancas continuas y una discontinua en el centro.

Antes de ejecutar nada, adivina si saldrán más bordes en la parte continua o en la discontinua. Después cambia shapes.png por road.png en edges.py y cuéntalos.

Sobre este laboratorio y su código: Laboratorio de visión por computador: píxeles, umbrales y recuento de objetos en JupyterLab

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.