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

时间:2017-04-07 16:31:26

标签: matlab matrix octave

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

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

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

完成第一步,矩阵的尺寸从2D变化 - > 3D(最后一个指数显示分裂指数)

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

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

我已经尝试使用permut并重塑但不成功

这是我的代码

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

任何想法都会受到赞赏。

1 个答案:

答案 0 :(得分:0)

reshape选择列主要排序中的元素,因此您可能必须编写复杂的代码才能使其生效。我建议使用permute将矩阵拆分为单元格数组,而不是采用reshapemat2cell创建4D矩阵并可能遇到内存不足的问题。因为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?