Конвертировать 4D .nii файл в.png

У меня есть файл 4D .nii, такой как "Filter_func_data.nii" из: [ https://nifti.nimh.nih.gov/nifti-1/data]

Загружая данные и получая доступ к полю img:

S = load_nii('filtered_func_data.nii')
S = 

       hdr: [1x1 struct]
  filetype: 2
fileprefix: 'filtered_func_data'
   machine: 'ieee-be'
       img: [4-D int16]
  original: [1x1 struct]

A = S.img

с размером:

size(A)

ответ =

64    64    21   180

Таким образом, данные состоят из 64x64 изображений с глубиной / числом срезов 21 и числом кадров 180. Может кто-нибудь помочь мне преобразовать эти данные.nii в 21*180= 3780 png изображений с размером 64*64? Кроме того, я хочу удалить последние 10 фрагментов каждого временного курса.

1 ответ

Решение

Во-первых, вы можете удалить последние 10 томов изображений, проиндексировав массив следующим образом:

A = A(:, :, :, 1:170);

Вы также захотите преобразовать свои данные из 16-разрядных целых чисел со знаком в 16-разрядные целые числа без знака, поскольку int16 не поддерживается для файлов PNG (как показывает сообщение об ошибке в вашем комментарии). Мой опыт работы с такими медицинскими изображениями заключается в том, что подавляющее большинство данных изображения находится в положительном диапазоне с несколькими ложными отрицательными значениями пикселей, поэтому вам, вероятно, будет хорошо просто обнулить отрицательные значения и преобразовать в целое число без знака (Вы можете посмотреть гистограмму значений ваших пикселей, чтобы быть уверенными):

A = uint16(A);  % Convert to unsigned, zeroing out negative values

Теперь, когда вы создаете все ваши PNG-изображения, вы, вероятно, захотите сгенерировать имя файла с индексами среза и времени, чтобы вы могли легче их идентифицировать и отсортировать. Вы можете перебирать каждое изображение размером 64 на 64, генерируя имя файла, используя sprintf и используя imwrite создать образ так:

[nRows, nCols, nSlices, nTimes] = size(A);
for iSlice = 1:nSlices
  for iTime = 1:nTimes
    fileName = sprintf('%s_%d_%d.png', S.fileprefix, iSlice, iTime);
    imwrite(A(:, :, iSlice, iTime), fileName);
  end
end

Если вы хотите сократить количество создаваемых вами файлов, вы можете собрать 21 фрагмент каждого тома изображения в мозаику 5 на 5, что даст вам одно увеличенное изображение (320 на 320) в каждый момент времени., Вы можете сделать это следующим образом, используя массивы ячеек, mat2cell а также cell2mat:

[nRows, nCols, nSlices, nTimes] = size(A);
for iTime = 1:nTimes
  C = cat(3, A(:, :, :, iTime), zeros(nRows, nCols, 4));  % Pad with 4 empty slices
  C = mat2cell(C, nRows, nCols, ones(1, 25));  % Place each slice in a cell
  C = cell2mat(reshape(C, 5, 5).');            % Reshape cell array and make mosaic
  fileName = sprintf('%s_%d_.png', S.fileprefix, iTime);
  imwrite(C, fileName);
end
Другие вопросы по тегам