web-dev-qa-db-fra.com

Charger une pile tiff dans un tableau numpy avec python

J'ai un petit problème avec les fichiers .tif. Je suis sûr que ce n'est qu'un problème mineur que je ne peux pas contourner (gardez à l'esprit, je suis un programmeur relativement nouveau).

Fondamentalement: j'ai préparé des fichiers .tif de taille 64x64xn (n jusqu'à 1000). L'image n'est qu'un seul fichier contenant toutes ces tranches. Je voudrais charger l'image dans un tableau numpy (multidimensionnel). J'ai essayé:

from PIL import Image as pilimage

file_path=(D:\luca\test\test.tif)
print("The selected stack is a .tif")
dataset = pilimage(file_path)
tiffarray = np.array(dataset)
expim = tiffarray.astype(np.double);
print(expim.shape)

et d'autres choses (comme tifffile). Il me semble seulement pouvoir lire la première tranche de la pile. Est-il possible pour "expim" de contenir toutes les informations enregistrées dans la pile tiff?

11
Luca Zangari

Je ne sais pas s'il existe un moyen d'obtenir PIL pour ouvrir plusieurs tranches d'une pile tiff.

Si vous n'êtes pas obligé d'utiliser PIL, cependant, une alternative est scikit-image , qui ouvre plusieurs tranches d'une pile tiff par défaut. Voici un exemple de code expliquant comment charger une pile tiff dans un tableau Numpy à l'aide de scikit-image:

>>> from skimage import io
>>> im = io.imread('an_image.tif')
>>> print im.shape
(2, 64, 64)

Notez que la fonction imread charge l'image directement dans un tableau Numpy. De plus, les dimensions du tableau résultant sont ordonnées (z, y, x) où z représente la profondeur, y représente la hauteur et x représente la largeur. Ainsi, pour obtenir une seule tranche de la pile, il vous suffit de:

>>> print im[1].shape
(64, 64)
18
forty_two

PIL a une fonction seek pour se déplacer vers différentes tranches d'une pile tiff.

from PIL import Image

file_path=(D:\luca\test\test.tif)
print("The selected stack is a .tif")
dataset = Image.open(file_path)
h,w = np.shape(dataset)
tiffarray = np.zeros((h,w,dataset.n_frames))
for i in range(dataset.n_frames):
   dataset.seek(i)
   tiffarray[:,:,i] = np.array(dataset)
expim = tiffarray.astype(np.double);
print(expim.shape)
2
Misha Smirnov