Datos de imagen multicanal#

Más allá de las imágenes bidimensionales que pueden expresarse como una matriz 2D, las imágenes multidimensionales y multicanales también son bastante comunes. Por ejemplo, importemos la imagen hela-cells.tif:

from skimage.io import imread
image = imread('../../data/hela-cells.tif')
image.shape
(512, 672, 3)

Vemos que en lugar de solo filas y columnas de píxeles, ahora tenemos un número adicional que nos indica que tenemos tres planos en nuestros datos. En este caso, cada imagen corresponde a un canal, pero para otros datos podrían ser planos z, puntos de tiempo, etc.

Jugando con las dimensiones#

Reorganizar datos multidimensionales es a menudo necesario para que correspondan a la entrada de una función. Por ejemplo, microshow espera que los canales estén en la primera dimensión, por lo que tenemos que mover el último eje a la primera posición y usar la función de Numpy np.moveaxis para esto:

import numpy as np

image_rolled = np.moveaxis(image, source=2, destination=0)
image_rolled.shape
(3, 512, 672)

Hay muchas otras funciones en Numpy para realizar estas operaciones de movimiento de ejes. Por ejemplo np.swapaxes, np.rollaxis, etc.

Visualización de imágenes multicanal#

La función microshow se encarga de mostrar la imagen con valores predeterminados razonables:

from microfilm.microplot import microshow
microshow(image_rolled);
../_images/7bfd8e230b8ebdd57cb73deed2a03b74311803a8a6839ef5bfbb749dde77af5d.png

Por defecto, utiliza una combinación de mapas de colores Cian, Magenta y Amarillo, pero estos también se pueden cambiar:

microshow(image_rolled, cmaps=['pure_red', 'pure_green', 'pure_blue']);
../_images/27bcc8408b3311434fa27ed3580b067e4ead994e825c071957d1d7f3bcf48661.png

También podemos visualizar estos tres canales de forma independiente dividiéndolos. Además, podemos organizar múltiples imágenes una al lado de la otra usando subplots de matplotlib:

channel1 = image[:,:,0]
channel2 = image[:,:,1]
channel3 = image[:,:,2]

import matplotlib.pyplot as plt

fig, axs = plt.subplots(1, 3, figsize=(15,15))

microshow(channel1, ax=axs[0], cmaps='pure_cyan')
microshow(channel2, ax=axs[1], cmaps='pure_magenta')
microshow(channel3, ax=axs[2], cmaps='pure_yellow');
../_images/43d56d82425fab4913c6d37695790cab470f0a9294c90d67952ec7115f9461ed.png

Ejercicio#

Explora las tablas de búsqueda, también conocidas como mapas de colores en matplotlib y visualiza los tres canales anteriores de la manera más similar posible a cómo se visualiza la imagen en ImageJ.