首先,你可以像這樣通過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