使用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
以列的主要顺序选择元素,因此您可能必须编写复杂的代码才能使其正常工作。与其使用 permute
和 reshape
创建 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?
我有尺寸为 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
以列的主要顺序选择元素,因此您可能必须编写复杂的代码才能使其正常工作。与其使用 permute
和 reshape
创建 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?