使用python在numpy数组中加载tiff堆栈

时间:2016-06-09 09:35:54

标签: python arrays image numpy tiff

Hallo Stack Overflow社区,

我对.tif文件有点问题。我确信这只是一个小问题,我无法解决(请记住,我是一个相对较新的程序员)。

基本上:我准备了大小为64x64xn的文件(n直到1000)。图像只是包含所有这些切片的单个文件。我想将图像加载到(多维)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)

和其他东西(如tifffile)。我似乎只能读取堆栈的第一个切片。 “expim”是否可以包含tiff堆栈中保存的所有信息?

感谢任何帮助!

2 个答案:

答案 0 :(得分:16)

我不确定是否有办法让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)

答案 1 :(得分:1)

PIL有一个函数seek可以移动到tiff堆栈的不同切片。

from PIL import Image as pilimage

file_path=(D:\luca\test\test.tif)
print("The selected stack is a .tif")
dataset = pilimage(file_path)
w,h = dataset.size
tifarray = np.zeros((w,h,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)