¿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 convertir una imagen a gris

Después de esta lección: Puedo convertir una imagen en color a gris con los pesos de luminosidad.

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

Pasar a gris deja un número por píxel

Convertir una imagen a escala de grises es cambiar los tres números de cada píxel por uno solo, que dice cuánta luz hay. Casi todo el análisis de imágenes empieza así, porque medir un número es más fácil que medir tres.

Hoy aprendes la fórmula y la aplicas a mano.

Al final de esta lección

Nota

Puedo convertir una imagen en color a gris con los pesos de luminosidad.

Palabras clave

PalabraQué significaEjemplo
Escala de grisesimagen con un solo número por píxel, de 0 a 255
Luminosidadla luz que percibe el ojo en un punto
Pesocuánto cuenta cada canal en la suma0,587
Modo Lel modo de Pillow con un solo canal de gris
Media simplesumar los tres canales y dividir entre tres

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

El ojo ve más claro el verde

Si sumas los tres canales y divides entre tres, un verde puro sale mucho más oscuro de lo que lo ves. El ojo es más sensible al verde que al rojo, y mucho más que al azul.

Por eso la luminosidad da a cada canal un peso distinto: 0,299 al rojo, 0,587 al verde y 0,114 al azul. Los tres pesos suman 1.

Ejemplo resuelto: luminosidad frente a media simple

PíxelMedia simpleCon pesosQué se ve
(255, 0, 0)8576Un rojo algo oscuro
(0, 255, 0)85149Un verde claro
(0, 0, 255)8529Un azul casi negro
(255, 255, 255)255255Blanco
(197, 157, 62)138158El dorado de una moneda

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

La fórmula en Python

Código: python
# Los pesos de la luminosidad, multiplicados por 1000 para no usar decimales.
pixel = [197, 157, 62]
red = pixel[0]
green = pixel[1]
blue = pixel[2]
grey = (299 * red + 587 * green + 114 * blue) // 1000
mean = (red + green + blue) // 3
print("gris con pesos:", grey)
print("media simple:", mean)
# Cambia el píxel a [0, 255, 0]. ¿Qué método lo ve más claro?

La cuenta del píxel dorado

Comando
docker exec jupyter python3 -c "print((299 * 197 + 587 * 157 + 114 * 62) // 1000)"

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

Rojo puro: media y pesos

Comando
docker exec jupyter python3 -c "print(255 // 3, (299 * 255) // 1000)"

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

Los números enteros evitan los decimales

Los pesos se multiplican por 1000 y el resultado se divide entre 1000 con //, que descarta los decimales. Así el gris sale siempre como un número entero, de 0 a 255.

El primer Ejecutar imprime 158: es el gris del píxel dorado. El segundo imprime 85 76, la media simple y el gris con pesos del rojo puro.

Un error muy común

Advertencia

Mucha gente cree que el gris es la media de los tres canales. Esa media trata igual al verde y al azul, y el ojo no lo hace. Con los pesos, un verde puro sale a 149 y un azul puro a 29. Usa la media solo si te piden una media.

Qué cuenta el script de gris del laboratorio

El script grey.py convierte coins.png con convert("L"). Imprime en inglés: colour mode y grey mode son los dos modos, y pixels from 0 to 63 es cuántos píxeles tienen un gris en esa banda.

El píxel dorado de 50, 50 pasa a 158. Hay 63.231 píxeles oscuros, ninguno entre 64 y 127, 13.566 entre 128 y 191 y solo 3 entre 192 y 255.

Convierte la imagen de monedas a gris

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.

Ejemplo resuelto: píxeles por banda de gris

Banda de grisPíxelesQué hay ahí
0 a 6363.231El fondo oscuro
64 a 1270Nada: hay un hueco
128 a 19113.566Las monedas
192 a 2553Unos pocos puntos de brillo

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

Para ir más lejos: otros píxeles

En el código de arriba prueba el píxel [0, 0, 255] y compara los dos métodos. Después prueba [128, 128, 128].

Un píxel con los tres canales iguales no cambia de valor con ninguno de los dos métodos. ¿Por qué?

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.