2013-11-18 4 views
1

Я пытаюсь прочитать стек изображений в трехмерную матрицу (например, X, Y, Z). Цель состоит в том, чтобы пройти через все изображение (от (X1, Y1) до (Xn, Yn)). В каждой позиции, например (X1, Y3), я хочу прочитать весь массив Z и выполнить некоторую обработку на нем. . изображение, например, будет содержать результат вычисленияКак использовать python для чтения временных рядов из стека изображений?

в качестве примера, давайте предположим, что у меня есть 12 (3х3) изображения с данными отражательной каждое изображение дает отражательную месяц

изображение 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). начиная с (X1, Y1) и заканчивая на (X12, y12). Например, в (X1, Y3) Z-массив будет: [10, 21,.,.,., 65,.,.,., 12]. Я буду применять некоторые функции в массиве, например, максимальное значение массива. Значение нового выходного изображения для местоположения (X1, Y3) было бы, например, 65.

Я сделал что-то подобное в IDL, используя библиотеку обработки изображений ENVI. Но я действительно хотел бы сделать это с помощью python, поскольку моя цель - перейти на языки с открытым исходным кодом. Я только начал использовать python, и мой поиск до сих пор не дал мне никакого решения, почему я обращаюсь к помощи более опытных пользователей python.

Большое спасибо, Angela

+0

Вы можете использовать opencv и numpy. – slider

ответ

4

Использование 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-массив.

Если у вас есть вопросы, напишите комментарий, и я обновлю соответствующим образом.

+0

Когда я попытался запустить этот код на нескольких tiffs и получил его для записи в .txt-файл, я получил целую кучу символов «ø». Я не уверен, что происходит. – Dzinic

+0

Когда я напечатал результаты в своей IDE, я получил несколько массивов, содержащих только NaN. – Dzinic

+0

Я понятия не имею, что не так. Я проверил код на кучу изображений на моей машине, и он отлично работает. Попробуйте просто запустить строку 'cv2.imread (...)' в одном файле и проверить, действительно ли вы получили изображение, которое вы должны были использовать. Возможно, ваша установка OpenCV не могла обрабатывать ваши файлы. –

1

Одним из вариантов является использование панд, с ним было бы легко:

нагрузки данные:

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+') 

Для создания 3D-панели

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 
Смежные вопросы