2016-02-29 217 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);