2

我有一个 4D .nii 文件,如“filtered_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 大小为 64*64 的 png 图像? 另外,我想删除每个时间课程的最后 10 片。

4

1 回答 1

1

首先,您可以通过像这样索引数组来删除最后 10 个图像卷:

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

您还需要将数据从16 位有符号整数转换为16 位无符号整数,因为int16PNG 文件不支持(如您评论中的错误消息所示)。我对这样的医学图像的经验是,绝大多数图像数据都在正范围内,有一些虚假的负像素值,所以你可能只需将负值归零并转换为无符号整数(您可能需要查看像素值的直方图以确定):

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
于 2017-08-03T04:46:45.393 回答