Среднее из нескольких стеков

Как я могу усреднить несколько стеков за один раз? В идеале использовать инструмент с графическим интерфейсом, как ImageJ? Я хочу сделать это на наборах из 10-20 стеков: 1500x1500 пикселей, 500 срезов, 1 канал в каждом стеке. Загрузка всех их одновременно будет раздвигать границы моей оперативной памяти.

В качестве выхода я хочу один стек (1500x1500 пикселей, 500 срезов, 1 канал) с интенсивностями, усредненными по разным стекам.

ImageJ кажется ограниченным усреднением 2 стеков одновременно.

Я хотел бы иметь одинаковый вес для всех стеков в финальной средней.

2 ответа

В идеале использовать инструмент с графическим интерфейсом, как imageJ?

Вопросы, касающиеся использования ImageJ и не связанные с каким-либо фрагментом кода, не относятся к теме на stackru.com, и их лучше всего задавать на форуме ImageJ.

Как я могу усреднить несколько стеков за один раз?

В ImageJ вы можете построить гиперстек из ваших стеков (например, используя Image> Stacks> Tools> Concatenate..., а затем Image> Hyperstacks> Stack to Hyperstack...) и впоследствии создать среднюю проекцию (Image> Stacks> Z Проект...). Чтобы выполнить вашу задачу, вы должны назначить 500 срезов на стопку измерению t, а измеряемое измерение должно быть z.

Надеюсь, это поможет.

У меня слишком много стеков, чтобы объединить их в один большой гиперстек. У меня заканчивается память.

В итоге я вместо этого использовал python:

import tkFileDialog
import os
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
import glob
from tifffile import imsave

#select a directory containing tif-stacks to process
#tif-stacks must have equal dimensions

sd=tkFileDialog.askdirectory()

#list of files to process
fl= glob.glob(os.path.join(sd,'*.tif'))

#number of files to process
n_files=np.shape(fl)[0]

im = Image.open(fl[0])

#get number of frames in first file by seeking all frames until error occurs
#this seems clunky but is very fast
#assuming same number of frames for all files
n = 0
while True:
    n += 1
    try:
        im.seek(n)
    except:
        break
n_frames=n

#loop through all images,
#read each frame and accumulate frame-wise sum over all stacks

w, h = im.size
temp = np.zeros( (h,w,n_frames), dtype=np.int32 )

for i in range(n_files):
    print 'processing file: ', i
    im = Image.open(fl[i])

    for n in range (n_frames):
        curframe = np.array(im.getdata()).reshape(h,w)
        temp[:,:,n] += curframe
        im.seek(n)
        print ['frame: ', n],"         \r",

avgStack=temp/n_files

Я немного адаптировал приведенный выше код jlarsch, потому что он не работал в python3. Вот мое решение:

    from tkinter import filedialog
    import os
    from PIL import Image
    import numpy as np
    import glob
    from tifffile import imwrite, imread

    #select a directory containing tif-stacks to process
    #tif-stacks must have equal dimensions

    sd=filedialog.askdirectory()
    fl = glob.glob(os.path.join(sd, '*.tif'))

    #list of files to process
    fl= glob.glob(os.path.join(sd,'*.tif'))

    #number of files to process
    n_files=np.shape(fl)[0]
    #get number of frames in first file by seeking all frames until error occurs
    #this seems clunky but is very fast
    #assuming same number of frames for all files
    with Image.open(fl[0]) as im:
        h,w=im.size
        n = 0
        while True:
            n += 1
            try:
                im.seek(n)
            except:
                break
        n_frames = n

    #loop through all images,
    #read each stack and append to a 4-dimensional numpy array

    w, h = im.size
    temp = np.empty((0,n_frames,h,w), dtype=np.int32)
    for i in range(n_files):
        stack = imread(fl[i])
        temp = np.append(temp, stack[np.newaxis, :], axis=0)
    #average over all stacks
    average=np.mean(temp,axis=0)

    
    imwrite('average.tif', average)
Другие вопросы по тегам