numpy中图像堆栈的数量很慢

时间:2015-03-20 03:12:27

标签: python image numpy

我正在通过numpy / python将单独的tiff堆叠成单个3D数组。当文件被读取并插入某个变量时,速度会随文件数量线性变化,例如,加载100个文件需要0.2秒,加载1000个文件需要2.46秒等等。

然而,当我尝试从这些文件中创建3D堆栈时,使用 dstack()时间开始非线性缩放,例如10个文件为0.21秒,100个文件为5.39秒,依此类推。

我意识到减速是由dstack()背后的一些魔法引起的。从一组图像文件创建3D堆栈的最佳方法是什么?

如果我不使用dtack(),但预先创建3D阵列然后填充它,脚本运行得更快,但仍然非线性缩放(10秒为0.2秒,100秒为2.2秒,1000张图像为40秒) ) 本案的代码:

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条纹HDD中读取

1 个答案:

答案 0 :(得分:4)

您可以通过更改索引的顺序来解决此问题,从而使图像索引成为第一位。像这样:

i_max = 1000
sx, sy = 1000,1000
t = time.time()
for i in range(0,i_max):
    im = np.ones((sx,sy))
    if i>0:
        #stack[:,:,i] = im
        stack[i,:,:] = im
    else:
        #stack = np.empty((sx,sy,i_max))
        #stack[:,:,0] = im
        stack = np.empty((i_max, sx, sy))
        stack[0,:,:] = im
print toc(t)

我得到的时间是:

4.44851183891   # original order, i_max = 100
118.510767937   # original order, i_max = 1000

1.78239989281   # modified order, i_max = 100
23.4904351234   # modified order, i_max = 1000

我认为这样做的原因是数据不是逐位处理的,而是以固定大小的块进行处理,而不管每个块中实际使用了多少数据。使用原始订单时,块没有得到有效使用。例如,请参阅此视频的前几分钟:https://vimeo.com/97337258也就是说,它不是关于RAM而是CPU缓存。