Canales

El término "canal" es utilizado de forma genérica para referirse a un componente de una imagen que, de una forma u otra, determina el color de cada píxel a mostrar. Por ejemplo, una imagen GIF almacena cada píxel como una referencia a una tabla de colores. En función del modelo de color utilizado, los canales son unos u otros.

El modelo RGB es uno de los más utilizados, representando los componentes rojo, verde y azul en diferentes canales, cada uno de ellos almacenando valores entre 0 y 255 (o entre 0 y 1). Estos valores, en realidad, representan la intensidad del brillo de la imagen para cada uno de dichos colores.

La imagen vista tiene cuatro canales: los tres correspondientes a los colores rojo, verde y azul, y uno adicional almacenando información de transparencia de la imagen:

img = plt.imread("https://www.interactivechaos.com/sites/default/files/data/sunset.png")
img.shape

(600, 800, 4)

Si extraemos un único canal -el primero, por ejemplo, correspondiente a los rojos-:

plt.imshow(img[:, :, 0]);

Canal rojo

...no estamos más que extrayendo intensidades de colores, no colores, por lo que no es posible establecer una correspondencia real entre los valores leídos y los colores reales. Sabiendo que se trata de las intensidades del canal rojo, podríamos simular el aspecto del canal añadiendo como cmap una paleta de rojos:

plt.imshow(img[:, :, 0], cmap = "Reds_r");

Canal rojo

En todo caso deberemos ser conscientes de que no estamos más que forzando un mapeado artificial entre los valores leídos y el mapa de color.

Podemos mostrar los canales 1 y 2 correspondientes a verdes y azules utilizando el mismo método:

plt.imshow(img[:, :, 1], cmap = "Greens_r");

Canal verde

plt.imshow(img[:, :, 2], cmap = "Blues_r");

Canal azul

El cuarto canal (el canal con índice 3, correspondiente a la transparencia) está formado, en este caso particular, por valores de 1 o muy próximos a uno:

np.mean(img[:, :, 3])

0.99998915

...indicando que la imagen es opaca. Si mostramos este canal utilizando como "mapeador" una escala de grises que asigne el negro al valor 1 (opaco) y el blanco al valor 0 (transparente), el resultado es el siguiente:

plt.imshow(img[:, :, 3], cmap = "gray_r");

Canal alfa