2014-03-03 56 views
1

我正在阅读具有可变数量对象的列表中的图像文件。Python 2.7:将多个数组的所有元素加在一起

如何将每个文件中的数组添加到对方?

下面是一个例子只增加两个数组:

imageArray= [sum(x,y) for x,y in zip(io.imread(list[1]),io.imread(list[2]))]  

我想要扩展这是能够添加可变数量的阵列。

我曾尝试以下,无果:

for x in filelist: 
    imageArray = [sum(y) for y in itertools.izip(io.imread(x))] 

其产生错误: TypeError: Invalid dimensions for image data

任何帮助,将不胜感激!

编辑

我已经能够使用下面unutbu的部分答案的所有图像读入数组:

im = map(SNIO.imread,filelist) 

从这里,我想对所有产生的阵列加在一起(元素明智)。正确的解决办法从下面的代码重现的结果:

imageArray = [x+y+z for x,y,z in zip(im[0],im[1],im[2])] 

,工作正常,但正如原来的问题说,我希望与任何数量的阵列要做到这一点,而不是指定它们在之前例。

回答

1

io.imread是否与scipy.ndimage.io.imread相同? 如果是这样,那么添加的数组元素的角度来看,使用np.add.reduce

import numpy as np 
import scipy.ndimage.io as SNIO 
files = ... 
arrs = map(SNIO.imread, files) 
result = np.add.reduce(arrs) 

这将远远超过调用Python的sum功能在阵列中的每个位置更快。

+0

'io.imread'是'skimage.io.imread',我认为它和'scipy.ndimage.io.imread'是一样的。然而,这个解决方案并没有像预期的那样工作。 'map.SNIO.imread,files'是一个好的开始,但'np.add reduce(arrs)'不会产生我想要的结果。我将编辑这个问题来澄清。 – salamander

+1

我相信'np.add.reduce(arrs)'应该产生你正在寻找的结果 - 只要'arrs'中的值不会导致算术溢出。还要注意,如果RGB图像每个通道具有8位,则每个通道中的值可以在0-255范围内。总结后,结果可能会轻松超过255.所以结果必须重新调整才能被视为图像 - 如果这是你正在做的事情...你可以张贴一些示例图像并解释你期望的结果吗? – unutbu

+0

解决了它!正如你所说,我认为问题在于结果数值超过了255。谢谢! – salamander

相关问题