首先,您可以通过像这样索引数组来删除最后 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