Mise à l’échelle#
La mise à l’échelle des images est une méthode intelligente pour prétraiter les données d’image, idéalement après l’élimination du bruit et de l’arrière-plan. Elle permet de réduire la taille de l’image à un degré tel que la question scientifique peut encore être répondue, tout en gérant les contraintes de mémoire. Par exemple, si l’ordinateur se plaint d’erreurs de mémoire insuffisante, la mise à l’échelle d’une image à une taille plus petite est la première méthode à essayer pour poursuivre un projet. De plus, il existe de nombreux algorithmes de segmentation et méthodes de mesure quantitative qui ont l’isotropie des pixels/voxels comme condition préalable : les voxels doivent avoir la même taille dans toutes les directions, sinon les résultats de ces algorithmes pourraient être trompeurs ou même erronés.
import pyclesperanto_prototype as cle
import matplotlib.pyplot as plt
from skimage.io import imread
Pour démontrer la mise à l’échelle, nous utilisons des données d’image recadrées et rééchantillonnées du Broad Bio Image Challenge : Ljosa V, Sokolnicki KL, Carpenter AE (2012). Annotated high-throughput microscopy image sets for validation. Nature Methods 9(7):637 / doi. PMID: 22743765 PMCID: PMC3627348. Disponible sur http://dx.doi.org/10.1038/nmeth.2083
input_image = imread("../../data/BMP4blastocystC3-cropped_resampled_8bit.tif")
# la taille des voxels n'est pas égale dans toutes les directions ;
# les voxels sont anisotropes.
voxel_size_x = 0.202
voxel_size_y = 0.202
voxel_size_z = 1
Lors de la visualisation des projections de cet ensemble de données selon les trois axes, vous voyez que les voxels ne sont pas isotropes.
def show(image_to_show, labels=False):
"""
Cette fonction génère trois projections : dans les directions X, Y et Z et les affiche.
"""
projection_x = cle.maximum_x_projection(image_to_show)
projection_y = cle.maximum_y_projection(image_to_show)
projection_z = cle.maximum_z_projection(image_to_show)
fig, axs = plt.subplots(1, 3, figsize=(10, 10))
cle.imshow(projection_x, plot=axs[0], labels=labels)
cle.imshow(projection_y, plot=axs[1], labels=labels)
cle.imshow(projection_z, plot=axs[2], labels=labels)
axs[0].set_title("Plan ZY")
axs[1].set_title("Plan XZ")
axs[2].set_title("Plan XY")
plt.show()
show(input_image)
Mise à l’échelle avec la taille des voxels#
La façon la plus simple de résoudre ce problème est de mettre à l’échelle l’ensemble de données avec sa taille de voxel. Par définition, cela aboutira à un ensemble de données où les voxels sont isotropes et ont voxel_size = 1 (microns dans notre cas) dans toutes les directions.
scale_factor_x = voxel_size_x
scale_factor_y = voxel_size_y
scale_factor_z = voxel_size_z
resampled = cle.scale(input_image,
factor_x=scale_factor_x,
factor_y=scale_factor_y,
factor_z=scale_factor_z,
linear_interpolation=True,
auto_size=True)
show(resampled)
La pile rééchantillonnée a maintenant moins de voxels en X et Y, ce qui pourrait être un problème lors de la segmentation précise des objets. Nous pouvons le voir clairement en affichant la forme des données originales et de l’image rééchantillonnée. C’est la taille de la pile d’images en profondeur-hauteur-largeur (Z-Y-X).
input_image.shape
(86, 396, 393)
resampled.shape
(86, 80, 79)
Une solution potentielle est d’introduire un zoom_factor. Il permet d’ajuster la taille de l’image rééchantillonnée :
zoom_factor = 2
scale_factor_x = voxel_size_x * zoom_factor
scale_factor_y = voxel_size_y * zoom_factor
scale_factor_z = voxel_size_z * zoom_factor
resampled_zoomed = cle.scale(input_image,
factor_x=scale_factor_x,
factor_y=scale_factor_y,
factor_z=scale_factor_z,
linear_interpolation=True,
auto_size=True)
show(resampled_zoomed)
resampled_zoomed.shape
(172, 160, 159)
Lors du zoom/mise à l’échelle d’images 3D, gardez à l’esprit les limitations de mémoire. Vous pouvez lire la taille des images dans la boîte à droite dans la vue suivante. Zoomer une image par un facteur 2, comme dans l’exemple ci-dessus, augmente la taille de l’image d’une pile 3D par un facteur 8 (2x2x2).
resampled
|
|
cle._ image
|
resampled_zoomed
|
|
cle._ image
|
Exercice#
Augmentez le facteur de zoom et relancez le code ci-dessus. À quel facteur de zoom le programme plante-t-il ? Quelle serait la taille de l’image qui serait générée s’il ne plantait pas ? Quelle est la capacité mémoire de votre carte graphique ?