2017-08-03 305 views
2

我有一个4D .nii文件就像从 “filtered_func_data.nii”:https://nifti.nimh.nih.gov/nifti-1/data]转换4D .nii文件,png格式

通过加载数据和访问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 

因此,数据由深度/切片数量为21,帧数为180的64x64图像组成。 有人可以帮助我将此.nii数据转换为21 * 180 = 3780 png图像,大小为64 * 64?另外,我想删除每个时间过程的最后10个切片。

回答

1

首先,你可以像这样通过indexing the array删除最后一个10个的图像体积:

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

你还需要将数据转由16-bit signed integers16-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 arraysmat2cellcell2mat

[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 
+0

谢谢您的回答。我试了一下,它给了我这个错误: 警告:数据丢失和意外的结果可能会发生在带符号的像素数据。 > 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

+0

@ user1603454:我更新了答案解决错误 – gnovice

+0

谢谢你现在的工作:) – user1603454