2014-12-23 2 views
3

Мне нужно сбрасывать большие 3D-изображения (30 ГБ +), которые состоят из серии 2d фрагментов tiff произвольными факторами без вмешательства. scipy.ndimage.zoom отлично подходит для ввода изображений, которые вписываются в ОЗУ.Уменьшение размера большого 3D-изображения в numpy

Я думал о чтении в частях стека и используя scipy.ndimage_map_coordintes, чтобы получить интерполированные координаты пикселей. Другая идея заключалась в создании массива с отображением памяти с использованием numpy.memmap и выполнении scipy.ndimage.zoom на этом.

Есть ли у кого-нибудь лучшие подходы, прежде чем я продолжу это?

ответ

1

Итак, я разработал, что делать, глядя на исходный код ImageJ. Я разместил его здесь, если он помогает кому-либо еще:

import SimpleITK as sitk 
import cv2 
import numpy as np 

def downsample_large_volume(img_path_list, input_voxel_size, output_voxel_size): 

    scale = input_voxel_size/output_voxel_size 
    resampled_zs = [] 

    #Resample z slices 
    for img_path in img_path_list: 
     z_slice_arr = cv2.imread(img_path, cv2.CV_LOAD_IMAGE_GRAYSCALE) 
     z_slice_resized = cv2.resize(z_slice_arr, (0, 0), fx=scale, fy=scale, interpolation=cv2.INTER_AREA) 
     resampled_zs.append(z_slice_resized) # Or save to disk to save RAM and use np.memmap for xz scaling 


    temp_arr = np.dstack(resampled_zs) # We seem to be in yxz space now 
    final_scaled_slices = [] 

    # Resample xz plane at each y 
    for y in range(temp_arr.shape[0]): 
     xz_pane = temp_arr[y, :, :] 
     scaled_xz = cv2.resize(xz_pane, (0, 0), fx=scale, fy=1, interpolation=cv2.INTER_AREA) 
     final_scaled_slices.append(scaled_xz) 

    final_array = np.dstack(final_scaled_slices) 


    img = sitk.GetImageFromArray(np.swapaxes(np.swapaxes(final_array, 0, 1), 1, 2)) 
    sitk.WriteImage(img, 'scaled_by_pixel.nrrd') 
Смежные вопросы