Un umbral decide qué píxel es objeto
Un umbral es un nivel de gris que separa los píxeles claros de los oscuros, y con él un programa separa los objetos del fondo. Es la forma más sencilla de decirle a un ordenador dónde está una moneda en una foto.
Hoy miras cuántos píxeles hay de cada gris y eliges el umbral con esa vista.
Al final de esta lección
Nota
Puedo elegir un umbral que separe los objetos del fondo.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Histograma | cuántos píxeles hay en cada tramo de gris | |
| Banda | un tramo de niveles de gris | 0 a 63 |
| Umbral | el nivel que separa claro de oscuro | 100 |
| Máscara | imagen de unos y ceros: 1 es objeto | |
| Fondo | lo que rodea a los objetos |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un histograma cuenta píxeles por tramo de gris
Un histograma reparte los píxeles en bandas de gris y cuenta cuántos caen en cada una. Si una banda se llena y otra está vacía, hay dos grupos en la imagen.
En la imagen de monedas, el fondo es oscuro y las monedas son claras. Entre los dos grupos queda un hueco, y el umbral va dentro de ese hueco.
Ejemplo resuelto: el histograma de las monedas
| Banda de gris | Píxeles | Qué hay ahí |
|---|---|---|
| 0 a 63 | 63.231 | El fondo |
| 64 a 127 | 0 | El hueco: aquí va el umbral |
| 128 a 191 | 13.566 | Las monedas |
| 192 a 255 | 3 | Puntos de brillo |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
En qué banda cae un gris
docker exec jupyter python3 -c "print(158 // 64, 35 // 64)"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
La división entera da la banda
Dividir un gris entre el ancho de la banda y descartar los decimales da el número de banda. El Ejecutar imprime 2 0.
Un gris de 158, el de una moneda, cae en la banda 2, la de 128 a 191. Un gris de 35, el del fondo, cae en la banda 0.
Un umbral convierte la imagen en máscara
Un umbral hace una pregunta a cada píxel: ¿eres más claro que este nivel? Si la respuesta es sí, el píxel vale 1. Si es no, vale 0.
El resultado es una máscara: una imagen de unos y ceros donde el 1 marca el objeto. Se usa > y no >=, así que un píxel igual al umbral queda fuera.
Una máscara con un umbral
# Un umbral convierte cada píxel en un sí o un no.
picture = [
[12, 30, 190, 200],
[15, 25, 210, 40],
[10, 20, 35, 220],
]
level = 100
mask = []
for row in picture:
new_row = []
for value in row:
if value > level:
new_row.append(1)
else:
new_row.append(0)
mask.append(new_row)
print(mask)
# Cambia level a 30. ¿Qué pasa con el fondo?
Qué cuenta el script del umbral
El script threshold.py prueba tres umbrales sobre coins.png, que tiene 76.800 píxeles. Imprime en inglés: threshold es el umbral y keeps es cuántos píxeles deja.
El umbral 30 deja 58.806, casi toda la imagen. El 100 deja 13.569, que son las monedas. El 160 deja 10.062 y corta parte de cada moneda.
Prueba tres umbrales en las monedas
docker exec jupyter python3 steps/threshold.pySe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejemplo resuelto: tres umbrales
| Umbral | Píxeles que deja | Qué pasa |
|---|---|---|
| 30 | 58.806 | Deja casi todo el fondo: el ruido pasa de 30 |
| 100 | 13.569 | Deja solo las monedas |
| 160 | 10.062 | Corta las monedas: su gris ronda 158 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un error muy común
Advertencia
Mucha gente cree que el ordenador elige solo el umbral correcto. No lo hace: el 100 funciona porque miraste el hueco del histograma. Con luz desigual, un solo umbral puede servir a un lado de la imagen y fallar en el otro. Mira siempre la máscara antes de fiarte.
Para ir más lejos: una página escaneada
Abre scan.png en JupyterLab. Tiene la luz desigual: más clara a la izquierda y más oscura a la derecha.
Prueba un solo umbral sobre toda la imagen y mira dónde falla. Después prueba otro umbral solo en la mitad derecha.