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
| Palabra | Qué significa |
|---|---|
| Borde | un cambio brusco de brillo entre vecinos |
| Gradiente | cuánto cambia el brillo de un píxel al siguiente |
| Intensidad del borde | el tamaño del cambio, sin signo |
| Mapa de bordes | una máscara con 1 donde hay borde |
| Canny | un 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íxel | Siguiente | Diferencia | Qué indica |
|---|---|---|---|
| 10 | 10 | 0 | Zona lisa |
| 10 | 10 | 0 | Zona lisa |
| 10 | 200 | 190 | Borde: el brillo sube |
| 200 | 200 | 0 | Zona lisa |
| 200 | 200 | 0 | Zona lisa |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
El gradiente de una fila
# 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
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) | gx | gy | Intensidad | Borde con límite 100 |
|---|---|---|---|---|
| (0, 0) | 0 | 0 | 0 | 0 |
| (0, 1) | 190 | 0 | 190 | 1 |
| (1, 0) | 0 | 0 | 0 | 0 |
| (1, 1) | 190 | 0 | 190 | 1 |
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
docker exec jupyter python3 steps/edges.pySe 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
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.