Découpage et recadrage#

Lorsqu’on travaille avec des données d’image plus grandes, il est souvent logique de recadrer des régions et de se concentrer sur elles pour une analyse plus approfondie. Pour recadrer des images, nous utilisons la même syntaxe “:” que nous avons utilisée lors de l’indexation dans les listes et de l’exploration des données d’image multidimensionnelles.

import numpy as np
from skimage.io import imread, imshow

Nous commençons par charger une image 3D et afficher sa taille.

image = imread("../../data/Haase_MRT_tfl3d1.tif")

image.shape
(192, 256, 256)

Découpage#

Pour visualiser des images 3D à l’aide de la fonction imshow de scikit-image, nous devons sélectionner une tranche à visualiser. Par exemple, une tranche Z :

slice_image = image[100]

imshow(slice_image)
<matplotlib.image.AxesImage at 0x2b54f73d340>
../_images/b9ec53895c9942461dd35e1b88b95a9557441ceb09c074bd865d8bb6ddfdb74b.png

Nous pouvons également sélectionner un plan où tous les pixels ont la même position Y. Nous devons juste spécifier que nous souhaitons conserver tous les pixels en Z en utilisant la syntaxe :.

slice_image = image[:, 100]

imshow(slice_image)
<matplotlib.image.AxesImage at 0x2b54f836af0>
../_images/ad292cbffaab643c3d9273781ac2d7a8cb9aeed56d351d1c201b74c79fcbef31.png

Recadrage#

Nous pouvons également sélectionner une sous-pile en utilisant l’indexation dans les crochets carrés.

sub_stack = image[50:150]

sub_stack.shape
(100, 256, 256)

Nous pouvons également sélectionner une sous-région en X. Si nous voulons conserver tous les pixels le long de Z et Y (les deux premières dimensions), nous spécifions simplement : pour tout conserver.

sub_region_x = image[:, :, 100:200]

imshow(sub_region_x[100])
<matplotlib.image.AxesImage at 0x2b54f8ae850>
../_images/38728fe7d44860c0fac1767af8007785db40a1042ac2162ae73b3055cddc2023.png

Pour sélectionner tous les pixels dans une direction au-dessus d’une valeur donnée, nous devons simplement spécifier le début avant :.

sub_region_y = image[:, 100:]

imshow(sub_region_y[100])
<matplotlib.image.AxesImage at 0x2b54f90ae20>
../_images/97bd447a765eff73cd22753868fe6c2e3f250a63db6ed468f116ff74bd9615b7.png

De même, nous pouvons sélectionner tous les pixels jusqu’à une position donnée.

sub_region_x2 = image[:, :, :50]

imshow(sub_region_x2[100])
<matplotlib.image.AxesImage at 0x2b550943d30>
../_images/b1b6f01794a399ac2db4297973bb8e34233be52f6b5d98b70d683d3a5cd5f8df.png

Enfin, voici comment un cube recadré est spécifié.

cropped_cube = image[80:130, 120:170, :50]

cropped_cube.shape
(50, 50, 50)
imshow(cropped_cube[20])
<matplotlib.image.AxesImage at 0x2b5509a4a00>
../_images/474a83bfd6b87d735ccfa7e5e30c1fdae98c834ef6ced02f2a06bc9f939c8ef0.png

Et voici à quoi ressemblent les projections d’intensité maximale de ce cube recadré.

maximum_intensity_projection_along_z = np.max(cropped_cube, axis=0) 
imshow(maximum_intensity_projection_along_z)
<matplotlib.image.AxesImage at 0x2b550a03f40>
../_images/b60a8d4d3c16d68ffeb90787bbe80d7455732026daee8c574df5a01ff6518f14.png
maximum_intensity_projection_along_y = np.max(cropped_cube, axis=1) 
imshow(maximum_intensity_projection_along_y)
<matplotlib.image.AxesImage at 0x2b550a5e8e0>
../_images/6a8879bc26fa9b800fb1edf6cccbd641a2638dd0796f9c417c3015f452f385ce.png