2017-08-03 135 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

相關問題