我有一组(>10,000)大型未压缩图像(1200,1600)存储为 TIFF 堆栈。
我无法将它们直接加载到内存中,因为文件的总大小超过了可用内存。是否有一种机制,在 python(首选)或 C++(可通过)中,堆栈可以逐帧(或块)打开,以消除将整个堆栈加载到内存中的需要。
我已经在 python 中尝试了
tifffile
和 PIL
包,它们只在第一帧读取,大概是因为两者都有保护措施来防止加载大于可用内存的图像。
例如
from PIL import Image
V = Image.open(filepath)
print(V.size)
以上返回
(1200,1600)
这不是3D,因为它应该是
from tifffile import TiffFile
V = TiffFile(filepath)
print(len(V.pages))
回报
1
应该> 10,000
如果不加载整个堆栈可能无法解析所有帧,但我正在寻找潜在的选择
你说你试过
tifffile
包。 文档 显示您可以阅读单个页面、页面子集,甚至遍历页面:
从 TIFF 文件的第一页读取图像作为 NumPy 数组:
>>> image = imread('temp.tif', key=0) >>> image.shape (301, 219)
从选定的页面范围内读取图像:
>>> images = imread('temp.tif', key=range(4, 40, 2)) >>> images.shape (18, 301, 219)
遍历 TIFF 文件中的所有页面并依次读取图像:
>>> with TiffFile('temp.tif') as tif: ... for page in tif.pages: ... image = page.asarray()
我相信 Pillow (née PIL) 也有类似的可能性。
我会推荐 Bio-Formats (python-bioformats) 用于处理专门的文件类型,而 imageio 用于普通文件类型。您的 TIFF 文件似乎介于两者之间,两者都可以帮助您。