使用Python将tiff堆栈加载到numpy数组中

15

我在使用.tif文件时遇到了一些小问题。我相信这只是一个我无法解决的小问题(请记住,我是一名相对较新的程序员)。

基本上来说:我准备了大小为64x64xn(n最多1000)的.tif文件。该图像只是包含所有切片的单个文件。我想将该图像加载到(多维)numpy数组中。我已经尝试过:

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)

还有其他一些东西(如tiff文件)。我似乎只能读取堆栈的第一个切片。 "expim"是否能够包含保存在tiff堆栈中的所有信息?

2个回答

27

我不确定是否有一种方法可以让PIL打开TIFF堆栈的多个切片。

然而,如果您不必使用PIL,则一个替代方法是scikit-image,它默认情况下会打开TIFF堆栈中的多个切片。以下是使用scikit-image将TIFF堆栈加载到Numpy数组中的示例代码:

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

请注意,imread函数将图像直接加载到Numpy数组中。此外,生成的数组的维度是按顺序排列的(z,y,x),其中z表示深度,y表示高度,x表示宽度。因此,要从堆栈中获取单个切片,您只需执行以下操作:

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

不确定我得到的多页TIFF文件是否存在问题,但是出现了这个错误:KeyError: <COMPRESSION.CCITT_T6: 4> - arun

7
PIL有一个名为seek的函数,可以移动到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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接