【发布时间】:2015-03-20 03:12:27
【问题描述】:
我正在通过 numpy/python 将单独的 tiff 堆栈读取到单个 3D 数组中。当文件只是被读取并插入某个变量时,速度与文件数量成线性关系,例如,加载 100 个文件需要 0.2 秒,加载 1000 个文件需要 2.46 秒等等。
但是,当我尝试从这些文件中创建 3D 堆栈时,使用 dstack() 时间开始非线性缩放,例如10个文件0.21秒,100个文件5.39秒等等。
我意识到减速是由 dstack() 背后的一些魔法造成的。从一组图像文件创建 3D 堆栈的正确和最快的方法是什么?
如果我不使用 dtack(),而是预先创建 3D 数组然后填充它,脚本运行得更快,但仍然非线性缩放(0.2s 用于 10,2.2s 用于 100,40s 用于 1000 个图像) 本案例代码:
import numpy as np
from PIL import Image
import time
import random
def toc(t):
return time.time() - t
i_max = 1000
t = time.time()
for i in range(0,i_max):
fname = r"..\Pos0\img_"+("%09d"%i)+"_Default_000.tif"
im = np.array(Image.open(fname))
if i>0:
stack[:,:,i] = im
else:
s = im.shape
stack = np.empty((s[0],s[1],i_max))
stack[:,:,0] = im
print toc(t)
PS:Python 2.7.8 Anaconda 2.1,Intel i5 @ 32GB RAM,从 4-striped HDD 读取
【问题讨论】:
-
每张图片有多大 (MB)?如果您超出了可用 free RAM 的数量,这将解释从 100 到 1000 个图像的非线性增加,因为某些对象需要存储在交换内存上。从 10 到 100 的增加是线性的,您关于未预分配的猜测是正确的。
-
单个 tiff
-
除了索引之外,如果您需要经常加载相同的图像序列,值得首先将其转换为一个包含原始字节的大文件。一个转换工具,比如
Imagemagick,可以做到这一点并尝试使用多核,所以如果速度很重要,它会比使用 python 脚本转换更快。 -
问题是,我使用 MicroManager 获取图像,所以从技术上讲,我首先可以拥有单个文件堆栈。会更好吗,我有 >27k z 切片(或时间点,即 3D 图像)?我也希望能够从这 27k 帧中删除子堆栈