使用matlab将3d矩阵转换为4d矩阵

convert 3d matrix to 4d matrix using matlab

我有尺寸为 400 x 500 的二维矩阵,每个矩阵都显示一个图像。我的过程包含 2 个步骤:

1) 我必须对这些图像进行分区(将矩阵拆分为大小相等的子矩阵)

2) 我必须将这些拆分中的每一个都保存在一个矩阵中

第一步完成,矩阵维度从 2D 变为 3D(最后一个索引显示拆分索引)

现在对于第 2 步,我有 100 张图像,我想要一个具有 4 个维度的矩阵,最后一个索引显示图像的数量

示例:用于访问图像 40 的拆分 3:[:,:,3,40]

我已经尝试使用 permut 和 reshape 但没有成功

这是我的代码

nCol = 10;
nRow = 4;
K=dir(p);
Len=length(K);

for i=3:Len
    x1=imread(strcat(p,'\',K(i).name));
    [m,n,d1]=size(x1);
    if d1==1
        x=double(x1);
    else
        x=double(rgb2gray(x1));
    end
    x=imresize(x,NN);

   %% determined width and height of divided matrix %%%%%%%%%%%%%%%%%%%%%%%%%% 

   m = size(x,1)/nRow;
   n = size(x,2)/nCol;

   T = permute(reshape(permute(reshape(x, size(x, 1), n, []), [2 1 3]), n, m, []), [2 1 3]);

   Im=[Im T(:,:,:,i-2)];
end

如有任何想法,我们将不胜感激。

reshape 以列的主要顺序选择元素,因此您可能必须编写复杂的代码才能使其正常工作。与其使用 permutereshape 创建 4D 矩阵并可能 运行 进入内存不足问题,我建议使用 mat2cell 来拆分矩阵成一个元胞数组,因为 mat2cell 像你想要分割图像一样分割矩阵。

这里我用一张图片展示一个例子

RGB = imread('peppers.png');
x = rgb2gray(RGB); % x is a 384 x 512 matrix, we want to split in 3 rows and 2 columns
x2 = mat2cell(x,384*ones(3,1)/3,512*ones(2,1)/2); % 2D cell array, each cell holds a part of the image
imshow(x2{1,1}) % Top left part of the image

您可以遍历所有图像并创建一个 3D 元胞数组,其中数组中的每一层都代表分割成多个部分的每个图像。我建议预先分配数组并在循环内的正确层中分配矩阵,而不是逐步增加矩阵的大小。

似乎还有一个特定于图像处理工具箱的函数来执行您要执行的操作:检查此:How to divide an image into blocks in MATLAB?