2016-02-29 240 views
0

mat文件是一個156 * 192 * 25的3D矩陣。數據是mat文件中的一系列n = 25圖像。我怎麼能把這個3D矩陣轉換成25個二維矩陣並獨立顯示它們?感謝〜如何將3D矩陣轉換爲多個2D矩陣?

+1

你已經25點二維矩陣!你可以使用'varname(:,:,n)'來調用第n個元素......將其轉換爲單元陣列等是無用的! – bla

+0

如果其中一個答案解決了您的問題,請點擊複選標記考慮[接受它](http://meta.stackexchange.com/q/5234/179419)。這表明你已經找到了解決方案,這不再是一個懸而未決的問題。如果您的問題沒有得到解答,請解釋缺少的內容。 – Daniel

回答

5

我建議不要分裂您的圖片的堆棧,而不是簡單地使用I(:,:,3)比如你需要第三圖像。

要顯示你可以使用圖片:

montage(permute(I,[1,2,4,3])) 

要顯示所有圖像一起。因爲montage預計156*192*1*25用於堆積的灰度圖像,所以需要置換,第三個維度用於彩色通道。另外,以顯示單獨的圖像使用:

imshow(I(:,:,3)); 

每個圖像保存到一個單獨的文件墊使用:

for ix=1:size(I,3) 
    M=matfile(sprintf('image%03d',ix),'writable',true); 
    M.image=I(:,:,ix); 
end 
+0

非常感謝〜我可以使用I(:,:,t)獲取當前的x-y 2D數據〜此外,我想在for循環(針對不同的堆棧)期間將這些2D數據保存在不同的獨立mat文件中。那麼你能否給出一些關於如何在for循環中將當前2D數據保存在mat文件中的建議? – Echo0831

+0

我更新了我的答案,但在使用它之前,是否真的需要拆分數據集?使用'matfile'你也可以將所有數據保存在一個文件中,只加載相關的部分。 – Daniel

1

使用mat2cell命令,可以將3D值矩陣轉換爲一個陣列25單元,其中每個單元保持156x192 2D值矩陣:

M = rand(156,192,25); %// simulate your 3D data matrix 

Mcell = mat2cell(M,156,192,ones(1,25)); 

或者,使用arrayfun命令:

Mcell = arrayfun(@(x) M(:,:,x), 1:25, 'UniformOutput', false) 

您現在可以訪問25圖像逐一爲:

imageNum = 5;   %// example: access image num. 5 
image = Mcell{imageNum}; %// image: 156x192 value matrix 

將圖像保存在單元陣列中的一個好處是,您可以輕鬆地應用同樣的過濾器將所有的圖像,利用該cellfun命令,例如:

h = fspecial('motion', 50, 45); 
McellFiltered = cellfun(@(x) imfilter(x, h), Mcell, ... 
    'UniformOutput', false);