如何使用python从图像堆栈中读取时间序列?

如何使用python从图像堆栈中读取时间序列?,python,image,matrix,wrapper,Python,Image,Matrix,Wrapper,我试图将一堆图像读入一个三维矩阵(例如X、Y、Z)。目标是遍历整个图像(从(X1,Y1)到(Xn,Yn)。在每个位置,例如(X1,Y3),我希望读取整个Z数组并对其进行一些处理。例如,一个输出图像将包含计算结果 举个例子,假设我有12张(3x3)带有反射率数据的图像,每张图像给出一个月的反射率 图1: X1 X2 X3 Y1 10 10 14 Y2 12 14 16 Y3 10 19 17 图2: 20 21 23 20 23 29 21 22 21 。 . 图7:

我试图将一堆图像读入一个三维矩阵(例如X、Y、Z)。目标是遍历整个图像(从(X1,Y1)到(Xn,Yn)。在每个位置,例如(X1,Y3),我希望读取整个Z数组并对其进行一些处理。例如,一个输出图像将包含计算结果

举个例子,假设我有12张(3x3)带有反射率数据的图像,每张图像给出一个月的反射率

图1:

   X1 X2 X3
Y1 10 10 14
Y2 12 14 16
Y3 10 19 17
图2:

   20 21 23
   20 23 29
   21 22 21
。 .

图7:

   50 50 60
   60 70 60
   65 67 80
。 .

图12:

   X1 X2 X3
Y1 10 11 12
Y2 10 16 17
Y3 12 13 14
因此,在最后,我想读取每个(X,Y)位置的z数组。从(X1,Y1)开始,到(X12,y12)结束。例如,在(X1,Y3)处,z数组将是: [10,21,65,12]。我将在数组上应用一些函数,例如,数组的最大值。例如,位置(X1,Y3)的新输出图像的值将是65

我在IDL中也做过类似的事情,使用了ENVI图像处理库。但我真的很想用python来做这件事,因为我的目标是切换到开源语言。我刚刚开始使用python,我的搜索到目前为止还没有给我任何解决方案,这就是为什么我要向更有经验的python用户寻求帮助的原因

多谢各位,
Angela

使用numpy这其实很简单,所以我马上给你一些代码。 请注意,它不一定是完整的解决方案

import numpy as np
import cv2

image_files = [] # Your list of files
image_height = 3
image_width = 3
image_stack = np.empty((image_height, image_width, len(image_files))) # Create empty HxWxN array/matrix

for i, fname in enumerate(image_files):
    img = cv2.imread(fname, cv2.CV_LOAD_IMAGE_GRAYSCALE)
    image_stack[:,:,i] = img # Set the i:th slice to this image

mean_img = np.mean(image_stack, axis=2) # Take the mean for each pixel
因为我们只使用OpenCV加载图像,所以您当然可以将其与其他内容切换,只要它提供一个numpy数组


如果您有问题,请发表评论,我会相应地进行更新。

使用numpy这实际上非常简单,因此我将立即为您提供一些代码。 请注意,它不一定是完整的解决方案

import numpy as np
import cv2

image_files = [] # Your list of files
image_height = 3
image_width = 3
image_stack = np.empty((image_height, image_width, len(image_files))) # Create empty HxWxN array/matrix

for i, fname in enumerate(image_files):
    img = cv2.imread(fname, cv2.CV_LOAD_IMAGE_GRAYSCALE)
    image_stack[:,:,i] = img # Set the i:th slice to this image

mean_img = np.mean(image_stack, axis=2) # Take the mean for each pixel
因为我们只使用OpenCV加载图像,所以您当然可以将其与其他内容切换,只要它提供一个numpy数组


如果您有问题,请发表评论,我会相应地更新。

一个选项是使用熊猫,通过它可以很容易地:

加载数据:

import pandas as pd
from StringIO import StringIO
data1 = """   X1 X2 X3
Y1 10 10 14
Y2 12 14 16
Y3 10 19 17"""
df1 = pd.DataFrame.from_csv(StringIO(data1), sep='\s+')

data12 = """   X1 X2 X3
Y1 10 11 12
Y2 10 16 17
Y3 12 13 14"""
df12 = pd.DataFrame.from_csv(StringIO(data12), sep='\s+')
创建三维面板的步骤

panel = pd.Panel([df1.values,df12.values], items = ['image1','image12'], major_axis=df1.columns, minor_axis=df1.index)
要沿生成的三维对象的不同轴进行某些计算,请执行以下操作:

>>>   import numpy as np 
>>> panel.apply(np.average, axis=0)
    Y1    Y2    Y3
X1  10  10.5  13.0
X2  11  15.0  16.5
X3  11  16.0  15.5

>>> panel.apply(np.max, axis=1)
    image1  image12
Y1      12       12
Y2      19       16
Y3      17       17

>>> panel.apply(np.min, axis=2).T
         X1  X2  X3
image1   10  12  10
image12  10  10  12

一种选择是使用熊猫,这样做很容易:

加载数据:

import pandas as pd
from StringIO import StringIO
data1 = """   X1 X2 X3
Y1 10 10 14
Y2 12 14 16
Y3 10 19 17"""
df1 = pd.DataFrame.from_csv(StringIO(data1), sep='\s+')

data12 = """   X1 X2 X3
Y1 10 11 12
Y2 10 16 17
Y3 12 13 14"""
df12 = pd.DataFrame.from_csv(StringIO(data12), sep='\s+')
创建三维面板的步骤

panel = pd.Panel([df1.values,df12.values], items = ['image1','image12'], major_axis=df1.columns, minor_axis=df1.index)
要沿生成的三维对象的不同轴进行某些计算,请执行以下操作:

>>>   import numpy as np 
>>> panel.apply(np.average, axis=0)
    Y1    Y2    Y3
X1  10  10.5  13.0
X2  11  15.0  16.5
X3  11  16.0  15.5

>>> panel.apply(np.max, axis=1)
    image1  image12
Y1      12       12
Y2      19       16
Y3      17       17

>>> panel.apply(np.min, axis=2).T
         X1  X2  X3
image1   10  12  10
image12  10  10  12

你可以使用opencv和numpy。你可以使用opencv和numpy。当我尝试在一些TIFF上运行此代码并将其写入.txt文件时,我得到了一大堆“ø”符号。我不确定是什么导致了这种情况。当我在IDE中打印结果时,我得到了几个数组,其中除了NaN之外没有任何内容。我不知道是什么问题。我已经在我的机器上的一堆图像上测试了代码,它工作正常。试着运行
cv2.imread(…)
在单个文件上安装一行,并检查您是否实际获得了预期的图像。可能是您的OpenCV安装无法处理您的文件。我被迫使用python 2.6。我安装了一个与2.6兼容的OpenCV。这可能是原因吗?我不知道。抱歉。我的建议是找到一个
imread
无法读取(生成的
np.array
)中的NaN。我可以检查我的安装是否可以处理它。当我尝试在几个TIFF上运行此代码并将其写入.txt文件时,我得到了一大堆“ø”符号。我不确定是什么导致了这种情况。当我在IDE中打印结果时,我得到了几个数组,其中除了NaN之外没有任何内容。我不知道是什么问题。我已经在我的机器上的一堆图像上测试了代码,它工作正常。试着运行
cv2.imread(…)
在单个文件上安装一行,并检查您是否实际获得了预期的图像。可能是您的OpenCV安装无法处理您的文件。我被迫使用python 2.6。我安装了一个与2.6兼容的OpenCV。这可能是原因吗?我不知道。抱歉。我的建议是找到一个
imread
无法读取(结果
np.array
中的NaN)。我可以检查我的安装是否可以处理它。