Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将大型多层TIFF导入为NumPy阵列_Python_Numpy_Python Imaging Library_Tiff - Fatal编程技术网

Python 将大型多层TIFF导入为NumPy阵列

Python 将大型多层TIFF导入为NumPy阵列,python,numpy,python-imaging-library,tiff,Python,Numpy,Python Imaging Library,Tiff,我正在尝试将3D TIFF图像加载为NumPy阵列。我无法加载大索引的切片,最大索引大小取决于数组的大小。例如,使用2048x2048个图像的堆栈,我无法加载256=2^8之后的图像。对于1024x1024的堆栈,我无法加载1024=2^10之后的图像。i、 e.无论哪种情况,我只能访问TIF图像的前2^31字节。请注意,我只是尝试从堆栈中加载单个图像 我在Windows10上使用的是Python3.7.5、NumPy版本1.17.4和PIL版本6.2.1,这台机器的内存为8Gb 再现问题的最小

我正在尝试将3D TIFF图像加载为NumPy阵列。我无法加载大索引的切片,最大索引大小取决于数组的大小。例如,使用2048x2048个图像的堆栈,我无法加载256=2^8之后的图像。对于1024x1024的堆栈,我无法加载1024=2^10之后的图像。i、 e.无论哪种情况,我只能访问TIF图像的前2^31字节。请注意,我只是尝试从堆栈中加载单个图像

我在Windows10上使用的是Python3.7.5、NumPy版本1.17.4和PIL版本6.2.1,这台机器的内存为8Gb

再现问题的最小示例:

import numpy as np
from PIL import Image

# generate test image
fname = r"test.tif"
img = np.random.randint(2**16, size=(257, 2048, 2048), dtype=np.uint16)

# save test image
im_list = [Image.fromarray(img[ii].astype('uint16')) for ii in range(img.shape[0])]
im_list[0].save(fname, save_all=True, append_images=im_list[1:])

# load image
im_loaded = Image.open(fname)

# this succceeds
im_loaded.seek(255)
arr255 = np.asarray(im_loaded, dtype=np.uint16)

# this fails
im_loaded.seek(256)
arr256 = np.asarray(im_loaded, dtype=np.uint16)

这样,它最多只能访问2 GB。我认为改用Python memmap可以解决这个问题。修复得很好,谢谢你的快速修复@cgohlke!我想应该是这样的。@cgohlke的代码更改已经合并,所以这应该在Pillow 8.2.0中修复,该版本将于4月1日发布,因此最多只能访问2GB。我认为改用Python memmap可以解决这个问题。修复得很好,谢谢你的快速修复@cgohlke!我想应该是这样的。@cgohlke的代码更改已经合并,所以这应该在枕头8.2.0中修复,定于4月1日发布
Traceback (most recent call last):
  File "C:\Program Files\Python\Python37\lib\site-packages\IPython\core\interactiveshell.py", line 3319, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-107-3430f5720c7e>", line 2, in <module>
    arr256 = np.asarray(im_loaded, dtype=np.uint16)
  File "C:\Program Files\Python\Python37\lib\site-packages\numpy\core\_asarray.py", line 85, in asarray
    return array(a, dtype, copy=False, order=order)
TypeError: int() argument must be a string, a bytes-like object or a number, not 'TiffImageFile'
import libtiff
tif = libtiff.TIFF.open(fname, 'r')
for ii, tif_slice in enumerate(tif.iter_images()):
    if ii == 256:
        arr = np.asarray(tif_slice, dtype=np.uint16)