¿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

Fundamentos de la visión por computador

Aquí está la lección completa para leer. Crea una cuenta gratuita para practicarla en un laboratorio en vivo.

Laboratorio de contenedores11 min de lectura6 comandos

¿Cuántas monedas hay en la imagen?

Una persona cuenta las monedas de una foto en un segundo. Un ordenador recibe solo una larga lista de números y hay que decirle cómo convertirla en «nueve monedas». Hacerlo paso a paso es lo que llamamos visión por computador.

Al final de esta lección

Nota

Puedo leer los píxeles de una imagen y usar un umbral para contar los objetos que hay en ella.

Palabras clave

  • Píxel: un punto de una imagen, guardado como números.
  • Modo: la forma en que se ordenan los números, por ejemplo RGB (rojo, verde, azul) o L (un solo nivel de gris).
  • Nivel de gris: un número de 0 (negro) a 255 (blanco).
  • Umbral: un nivel de gris que separa los píxeles oscuros de los claros.
  • Filtro: una regla que cambia cada píxel según los píxeles de alrededor, como un desenfoque.
  • Etiqueta: un número que se da a cada objeto separado que se encuentra en una imagen.

Para empezar: lo que ya sabes

Nota

Responde mentalmente. 1. ¿Qué tres colores se mezclan para hacer todos los colores de una pantalla? 2. ¿Qué es más claro, 40 o 200, en una escala de 0 a 255? 3. ¿Qué hace > en una comparación? Respuestas: rojo, verde y azul; 200; pregunta si el lado izquierdo es mayor que el derecho.

Antes de empezar

Nota

Pulsa Iniciar el laboratorio en la barra de la parte superior de la lección y espera a que diga que está en marcha. Hay un solo contenedor, jupyter, y el terminal llega a su Python con docker exec jupyter, que ejecuta un comando dentro. El enlace JupyterLab abre su página web, en el puerto 8888, donde puedes abrir las imágenes y verlas. Cada botón Ejecutar de abajo escribe su comando en el terminal de tu laboratorio, uno tras otro en la misma sesión. Para verlos o para escribir los tuyos, pulsa Abrir el terminal (pestaña nueva) en la barra.

Una imagen es una cuadrícula de números

ls images lista las cinco imágenes que dibujó el laboratorio. El primer script abre coins.png y muestra lo que contiene. La respuesta dice que la imagen mide 320 píxeles de ancho y 240 de alto, en modo RGB. El píxel en 10, 10 es (35, 35, 35), casi negro: es el fondo. El píxel en 50, 50 es (197, 157, 62), un color dorado: es parte de una moneda. El nivel de gris medio de toda la imagen es 57,6, oscuro, porque casi todo es fondo.

Comando
docker exec jupyter ls images

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

Comando
docker exec jupyter python3 steps/look.py

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

El gris conserva el brillo y pierde el color

convert("L") da un solo número a cada píxel. El píxel de moneda (197, 157, 62) pasa a ser 158. Después el script cuenta los píxeles en cuatro franjas de gris. 63231 son oscuros, de 0 a 63, ninguno está en el medio y 13566 van de 128 a 191: dos grupos claros, el fondo y las monedas. También guarda coins_grey.png, que puedes abrir en JupyterLab.

Comando
docker exec jupyter python3 steps/grey.py

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

Un umbral separa lo oscuro de lo claro

Un umbral convierte una imagen gris en un sí o un no para cada píxel: ¿es más claro que este nivel? El script prueba tres niveles sobre 76800 píxeles. Con 30 se quedan 58806, casi toda la imagen, porque el fondo supera 30 en muchos sitios. Con 100 se quedan 13569, que son las monedas. Con 160 se quedan 10062 y se recorta parte de las monedas. Guarda el resultado del nivel 100 como coins_mask.png: blanco donde hay una moneda.

Comando
docker exec jupyter python3 steps/threshold.py

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

Comprueba

Consejo

¿Cuál de los tres niveles separó las monedas del fondo, y por qué falló el 30? Respuesta: el 100, porque queda en el hueco vacío entre el fondo oscuro y las monedas claras; el 30 está dentro del propio ruido del fondo, así que conserva también gran parte del fondo.

Un desenfoque calma el ruido

El escaneo de página, scan.png, tiene motas, como una fotocopia sucia. Un desenfoque sustituye cada píxel por un promedio de sus vecinos. El script mide cuánto varía una zona vacía de la página, sin escritura. Antes del desenfoque varía 25,3 niveles de gris. Después, solo 4,9. El ruido casi ha desaparecido, y la escritura también se verá más suave. Guarda scan_blurred.png para que compares.

Comando
docker exec jupyter python3 steps/blur.py

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

Contar objetos

Para contar las monedas, haz la máscara con el nivel que funcionó y pide a scikit-image que la etiquete: cada grupo de píxeles blancos que se tocan recibe su propio número. La respuesta es 9 objetos, las nueve monedas que dibujó el laboratorio. Las áreas son de tres tamaños: tres de 657 píxeles, tres de 1313 y tres de 2553, es decir, monedas pequeñas, medianas y grandes.

Comando
docker exec jupyter python3 steps/count.py

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

Un error frecuente

Advertencia

Mucha gente piensa que el ordenador encuentra solo el umbral correcto. No es así: tú elegiste 100 porque miraste los dos grupos de niveles de gris. En una imagen con luz desigual, como scan.png, un nivel que funciona a la izquierda puede fallar a la derecha. Comprueba siempre la máscara a simple vista antes de fiarte de un recuento.

El mismo trabajo en un cuaderno

Abre JupyterLab desde la barra y haz doble clic en start.ipynb. Hace lo que hacían los scripts, una celda cada vez. Haz clic en una celda y pulsa Mayús y Intro para ejecutarla. La imagen aparece debajo de la celda. La última celda espera tu propia pregunta: abre road.png o scan.png y pregúntale algo.

Comprobación final

Consejo

Responde sin mirar atrás. 1. ¿Qué rango de números usa un nivel de gris? 2. ¿Qué decide un umbral para cada píxel? 3. ¿Por qué el desenfoque redujo la variación de la zona vacía? 4. ¿Cuántas monedas encontró el etiquetado y cómo supiste que era correcto? Respuestas: de 0 a 255; si es más claro que el nivel; cada píxel pasó a ser un promedio de sus vecinos, así que los puntos claros y oscuros sueltos se acercaron al medio; 9, el mismo número que se dibujó.

Para docentes

Consejo

Esta lección es un pequeño ejemplo de una lección practicada en un laboratorio: los pasos y los botones Ejecutar son la lección, y el laboratorio es la copia propia de cada alumno. El laboratorio es un solo servicio, JupyterLab con Pillow, NumPy y scikit-image, y nada aquí se corrige solo: el alumno entrega un cuaderno suyo sobre una de las imágenes, descargado desde JupyterLab, y una frase sobre lo que mostró. Puntos clave: 1. Una imagen es una cuadrícula de números. 2. Un umbral divide los píxeles en dos. 3. Un filtro cambia un píxel según sus vecinos. Error frecuente: fiarse de un umbral o de un recuento sin mirar la máscara. Material: el laboratorio y un navegador. Consejo: pida a los alumnos que adivinen cada número antes de pulsar Ejecutar. Las imágenes se dibujan a partir de una semilla fija, así que cada copia da los mismos números, y el laboratorio no tiene redes neuronales ni OpenCV. Cópiela en su propio módulo y modifíquela, o cree una desde cero con el menú Lab del creador de lecciones.

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 estas lecciones a tus estudiantes con calificación y un laboratorio para cada uno.