首先,你可以像这样通过indexing the array删除最后一个10个的图像体积:
A = A(:, :, :, 1:170);
你还需要将数据转由16-bit signed integers到16-bit unsigned integers,因为int16
不支持PNG文件(作为评论中显示的错误消息)。我对这样的医学图像的经验是,绝大多数图像数据位于正范围,有一些虚假的负像素值,所以你可能会罚款只是将负值清零并转换为unsigned integer(你可能想看看你的像素值的直方图,可以肯定的):
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)。你可以这样做如下,使用cell arrays,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
谢谢您的回答。我试了一下,它给了我这个错误: 警告:数据丢失和意外的结果可能会发生在带符号的像素数据。 > In imwrite(line 447) 错误使用writepng> parseInputs(line 290) 预期输入为以下类型之一:double,single,logical,uint8, uint16 而是其类型为int16。 writepng错误(第20行) [results,unmatched] = parseInputs(data,map,filename,varargin {:}); imwrite错误(行472) feval(fmt_s.write, - 它没有创建任何PNG文件和fileName只是1 * 26矢量与一个单元格填充filtered_func_data_1_1.png – user1603454
@ user1603454:我更新了答案解决错误 – gnovice
谢谢你现在的工作:) – user1603454