Загрузка отдельных изображений из большого стека TIFF Python - PullRequest
0 голосов
/ 11 февраля 2020

Я работаю в 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-изображение: Merged RGB channels

Преобразовано в пространство HSV, только H-канал: Converted to HSV space, only H-channel

РЕДАКТИРОВАТЬ:

Я нашел способ определить номера изображений, которые я хочу загрузить из 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)
...