Я работаю в Python над стеками изображений до 1000 изображений в формате TIFF. Каждое изображение представляет собой 16-битное изображение, 2048x2048 пикселей, полный размер 8 МБ, поэтому полный стек составляет несколько ГБ. У меня есть три цветовых канала, которые я объединяю. Операции, которые я выполняю в объединенных стеках (например, преобразование в пространство HSV, применение фильтров ...), я выполняю для каждого отдельного изображения стека. Но когда я хочу загрузить полные стеки в начале, у меня явно заканчивается память.
Есть ли способ обработки этих больших стеков? У меня была идея загрузить только отдельные изображения из стека, выполнить операции с этим отдельным изображением и снова объединить его в стек. К сожалению, я не смог найти способ сделать это. Или есть лучшее решение? Любая помощь очень ценится.
Вот мой код (где мне не хватает памяти при загрузке изображений, но он работает с меньшими тестовыми стеками):
import numpy as np
from skimage import io
import matplotlib
b = io.imread('blue_channel.tif')
g = io.imread('green_channel.tif')
r = io.imread('red_channel.tif')
Npic = np.shape(b)[0] #get number of images
sizex = np.shape(b)[1] #get size in x
sizey = np.shape(b)[2] #get size in y
Ncol = 3
merged_channels = np.zeros([Npic, sizex, sizey, Ncol])
merged_channels[:,:,:,0] = r
merged_channels[:,:,:,1] = g
merged_channels[:,:,:,2] = b
merged_channels = merged_channels.astype(np.float32) #Cast Image data type
merged_channels /= 255 #Scale value to float32 range 0-1
merged_channels_hsv = np.zeros([Npic, sizex, sizey, Ncol])
for i in tqdm(range(Npic)):
merged_channels_hsv[i, :, :, :] = matplotlib.colors.rgb_to_hsv(merged_channels[i, :, :, :])
merged_channels_hsv *= 255
merged_channels_hsv = merged_channels_hsv.astype(np.uint8)
imsave('merged_channels_hsv.tif', merged_channels_hsv[:,:,:,:])
Здесь Вот примеры изображений: Объединенное RGB-изображение:
Преобразовано в пространство HSV, только H-канал:
РЕДАКТИРОВАТЬ:
Я нашел способ определить номера изображений, которые я хочу загрузить из TIFF-файла, используя
skimage.external.tifffile.imread(files, **kwargs)
:
import numpy as np
from tifffile import imread
def sequence(start, end):
res = []
diff = 1
x = start
while x <= end:
res.append(x)
x += diff
return res
seq = sequence(1, 100) #load first 100 images from stack
merged_channels = imread('filename.tif', key = seq)