我有尺寸为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
任何想法都会受到赞赏。
答案 0 :(得分:0)
reshape
选择列主要排序中的元素,因此您可能必须编写复杂的代码才能使其生效。我建议使用permute
将矩阵拆分为单元格数组,而不是采用reshape
和mat2cell
创建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?