Données d’images multi-canaux#

Au-delà des images bidimensionnelles qui peuvent être exprimées sous forme de matrice 2D, les images multidimensionnelles à plusieurs canaux sont également assez courantes. Par exemple, importons l’image hela-cells.tif :

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

Nous voyons qu’au lieu d’avoir simplement des lignes et des colonnes de pixels, nous avons maintenant un nombre supplémentaire qui nous indique que nous avons trois plans dans nos données. Dans ce cas, chaque image correspond à un canal, mais pour d’autres données, il pourrait s’agir de plans z, de points temporels, etc.

Jouer avec les dimensions#

La réorganisation des données multidimensionnelles est souvent nécessaire pour correspondre à l’entrée d’une fonction. Par exemple, microshow s’attend à ce que les canaux soient dans la première dimension, nous devons donc déplacer le dernier axe en première position et utiliser la fonction Numpy np.moveaxis pour cela :

import numpy as np

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

Il existe de nombreuses autres fonctions dans Numpy pour effectuer ces opérations de déplacement d’axes. Par exemple np.swapaxes, np.rollaxis, etc.

Visualisation d’images multi-canaux#

La fonction microshow se charge d’afficher l’image avec des paramètres par défaut raisonnables :

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

Par défaut, elle utilise une combinaison de cartes de couleurs Cyan, Magenta, Jaune, mais celles-ci peuvent également être modifiées :

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

Nous pouvons également visualiser ces trois canaux indépendamment en les séparant. De plus, nous pouvons disposer plusieurs images côte à côte en utilisant matplotlib subplots :

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

Exercice#

Explorez les tables de correspondance, aussi connues sous le nom de cartes de couleurs dans matplotlib et visualisez les trois canaux ci-dessus de manière aussi proche que possible de la façon dont l’image est visualisée dans ImageJ.