我正在MATLAB开展图像处理项目。为了更容易地预处理图像,我将其划分为行和列,因此从原始图像(2D uint8矩阵)开始,现在我有一个3D矩阵,就像堆栈一样。
处理完每个块之后,我想再次重新构图。问题是行数和列数是动态的,所以我不能使用(或不知道如何在这里使用它)cat
命令或[firstsubmatrix secondsubmatrix]
语法。
顺便说一句,我这样做了这个部门:
numRows = 3
numCols = 3
blockHeight = originalHeight / numRows;
blockWidth = originalWidth / numCols;
blocks = uint8(zeros(numCols * numRows, blockHeight, blockWidth));
因此,对于每个块,我使用
填充其内容y0 = (row - 1) * rowHeight + 1;
y1 = row * rowHeight;
x0 = (col - 1) * rowWidth + 1;
x1 = col * rowWidth;
blocks(numBlock, :, :) = originalImage(y0:y1, x0:x1);
有没有更好的方法,以及任何方式加入块?
答案 0 :(得分:3)
如果我正确理解你的问题,那么我就是这样做的: 假设我们有一些维度为m乘以
的数据矩阵[m n] = size(data);
rows_wanted = 10;
cols_wanted = 10;
submatrix_rows = rows_wanted*ones(1,m/rows_wanted);
submatrix_cols = cols_wanted*ones(1,n/cols_wanted);
data_cells = mat2cell(data,submatrix_rows,submatrix_cols);
for k1 = 1:submatrix_rows;
for k2 = 1:submatrix_cols;
proc_data_cells{k1,k2} = function_for_matrics(data_cells{k,l});
end
end
proc_data_mtx = cell2mat(proc_data_cells);
将您的数据转换为单元格,其中单元格的每个元素都是子矩阵,然后遍历每个元素,执行您的函数,并将其输出到新单元格。使用cell2mat输出完全连接的已处理矩阵。
如果您有权访问图像处理工具箱,我还会查看'blkproc'功能。
答案 1 :(得分:1)
关于你如何根据你的图表在2-D矩阵和3-D矩阵之间来回转换的具体问题,我首先假设originalHeight
和{{1可以分别按originalWidth
和numRows
平均分配。建立在之前被问到的a solution I gave到a similar problem之上,这里是一个只使用矩阵的重组和排列的解决方案:
numCols
请注意,3-D矩阵中的块沿第三维连接,因此%# Convert from 2-D to 3-D:
blocks = reshape(permute(reshape(originalImage,blockHeight,blockWidth,[]),...
[1 3 2]),blockHeight,blockWidth,[]);
%# Convert from 3-D to 2-D:
newImage = reshape(permute(reshape(blocks,blockHeight,[],blockWidth),...
[1 3 2]),originalHeight,originalWidth);
是来自2-D矩阵的i th 块。还要注意,这些解决方案将以行方式提取和填充二维矩阵中的块。换句话说,如果是blocks(:,:,i)
,那么originalImage = [A1 A2; A3 A4];
,blocks(:,:,1) = A1;
等等。