15

I am having a little issue with .tif files. I am sure it is only a minor problem that I can´t get around (keep in mind, I am a relatively new programmer).

Basically: I have prepared .tif files that are 64x64xn in size (n up until 1000). The image is only a single file that contains all of this slices. I would like to load the image into a (multidimensional) numpy array. I have tried:

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)

and other things (like tifffile). I only seem to be able to read the first slice of the stack. Is it possible for "expim" to contain all information that is saved in the tiff stack?

Dharman
  • 30,962
  • 25
  • 85
  • 135
Amadeus
  • 322
  • 1
  • 2
  • 9

2 Answers2

27

I am not sure if there is a way to get PIL to open multiple slices of a tiff stack.

If you are not bound to using PIL, however, an alternative is scikit-image, which opens multiple slices from a tiff stack by default. Here is some sample code of how to load a tiff stack into a Numpy array using scikit-image:

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

Note that the imread function loads the image directly into a Numpy array. Also, the dimensions of the resulting array are ordered (z, y, x) where z represents the depth, y represents the height, and x represents the width. Thus, to get a single slice from the stack all you have to do is:

>>> print(im[1].shape)
(64, 64)
Kolibril
  • 1,096
  • 15
  • 19
forty_two
  • 454
  • 3
  • 11
  • Not sure if there is an issue with the multi-page TIFF I got, but got this error: `KeyError: `. – arun Aug 17 '20 at 16:39
7

PIL has a function seek to move to different slices of a tiff stack.

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)
tink
  • 14,342
  • 4
  • 46
  • 50
Misha Smirnov
  • 126
  • 1
  • 3