Как сохранить файлы nii в один файл nii с помощью MATLAB

У меня есть 360 файлов 3D-nifti, я хочу прочитать все эти файлы и сохранить в один файл nifti, используя Инструмент Nifti Analyze, который должен создать 4D-файл большого размера. До сих пор я написал следующие строки

clear all;
clc; 

fileFolder=fullfile(pwd, '\functional');
files=dir(fullfile(fileFolder, '*.nii'));
fileNames={files.name};

     for i=1:length(fileNames)

          fname=fullfile(fileFolder,fileNames{i});
          z(i)=load_nii(fname);
          y=z(i).img;
          temp(:,:,:,i) = make_nii(y);
          save_nii(temp(:,:,:,i), 'myfile.nii')

fprintf('Iter:  %d\n', i)
end

Этот код использует переменную temp, которая представляет собой четырехмерную структуру и содержит все изображения. Однако myfile.nii - это всего лишь один файл, а не все изображения, потому что его размер всего 6 МБ, он должен быть как минимум 1 ГБ. Может кто-нибудь, пожалуйста, посмотрите и дайте мне знать, где я ошибаюсь?


person Vendetta    schedule 19.01.2017    source источник


Ответы (1)


Как вы это написали, ваш цикл перезаписывает myfile.nii, так как вы вызываете save_nii каждый раз в цикле только с последними данными. Вместо этого вы захотите вызвать save_nii только один раз вне цикла и сразу сохранить всю переменную temp.

for k = 1:numel(fileNames)
    fname = fullfile(fileFolder, fileNames{k});
    z(k) = load_nii(fname);
    y(:,:,:,k) = z(k).img;
end

% Create the ND Nifti file
output = make_nii(y);

% Save it to a file
save_nii(output, 'myfile.nii')
person Suever    schedule 19.01.2017
comment
Я пытался раньше, и я получаю сообщение об ошибке, связанное со структурой в строке save_nii. Ошибка: «Ссылка на поле для нескольких элементов структуры, за которой следует больше блоков ссылок, является ошибкой». Я думаю, это потому, что в temp есть два элемента: один .img, а другой — .hdr. Не могли бы вы прокомментировать это? Любые обходные пути? - person Vendetta; 20.01.2017
comment
Это решается вызовом make_nii и save_nii вне цикла, например. Цикл: y(:,:,:,i)=x(i).img end temp=make_nii(y) save_nii(temp,'myfile.nii') Спасибо за подсказку. - person Vendetta; 21.01.2017
comment
@Vendetta Извините, только что увидел ваш вчерашний комментарий. Да, вы правы, вам также придется создать файл, используя make_nii вне цикла. Я обновил ответ соответственно - person Suever; 21.01.2017