Конвертировать 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