【问题标题】:How to convert a 3D matrix into several 2D matrix?如何将一个 3D 矩阵转换为多个 2D 矩阵?
【发布时间】:2016-06-12 22:10:35
【问题描述】:

mat 文件是一个 156*192*25 的 3D 矩阵。数据是 mat 文件中的一系列 n=25 图像。如何将这个 3D 矩阵转换为 25 个 2D 矩阵并独立显示?谢谢~

【问题讨论】:

  • 你已经有 25 个二维矩阵了!您可以使用varname(:,:,n) 调用第n 个...投射到单元格数组等是没用的!
  • 如果其中一个答案解决了您的问题,请点击复选标记考虑accepting it。这表明您已经找到了解决方案,这不再是一个悬而未决的问题。如果您的问题没有得到解答,请说明缺少的内容。

标签: matlab mat-file


【解决方案1】:

我建议不要拆分您的图像堆栈,如果您需要第三张图像,只需使用I(:,:,3)

要显示您可以使用的图像:

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

同时显示所有图像。需要置换,因为montage 需要156*192*1*25 用于堆叠灰度图像,第三维是为颜色通道保留的。或者显示单个图像使用:

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

要将每个图像保存到单独的 mat 文件,请使用:

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

【讨论】:

  • 非常感谢~我可以使用 I(:,:,t) 来获取当前的 xy 2D 数据~ 此外,我想在 for 循环期间将这些 2D 数据保存在不同的独立 mat 文件中(对于不同的堆栈)。那么您能否就如何在 for 循环期间将当前 2D 数据保存在 mat 文件中提出一些建议?
  • 我更新了我的答案,但在使用它之前你真的需要拆分你的数据集吗?使用matfile,您还可以将所有数据保存在一个文件中并仅加载相关部分。
【解决方案2】:

使用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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    • 2016-08-25
    • 2020-11-09
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    相关资源
    最近更新 更多