Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MATLAB-合并子矩阵_Matlab_Image Processing_Matrix - Fatal编程技术网

MATLAB-合并子矩阵

MATLAB-合并子矩阵,matlab,image-processing,matrix,Matlab,Image Processing,Matrix,我在北京做一个图像处理项目。为了更容易地预处理图像,我将其分为行和列,因此从原始图像(2D uint8矩阵)开始,现在我有了3D矩阵,就像堆栈一样 在处理每个块之后,我想再次重新组合图像。问题是行和列的数量是动态的,因此我不能使用(或不知道如何在这里使用)cat命令或[firstsubmatrix-secondsubmatrix]语法 顺便说一下,我是这样划分的: numRows = 3 numCols = 3 blockHeight = originalHeight / numRows; b

我在北京做一个图像处理项目。为了更容易地预处理图像,我将其分为行和列,因此从原始图像(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);

是否有更好的方法,以及是否有方法将块连接起来?

如果我正确理解了你的问题,那么我会这样做: 假设我们有一些维数为m×n的数据矩阵

[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”函数。

关于您的具体问题,即如何根据图表在二维矩阵和三维矩阵之间来回转换,我首先假设
originalHeight
originalWidth
可以分别被
numRows
numCols
平均分割。基于之前提出的问题,这里有一个仅使用矩阵的重塑和置换的解决方案:

%# 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);

请注意,三维矩阵中的块是沿三维连接的,因此
块(:,:,i)
是二维矩阵中的第i个块。还请注意,这些解决方案将以行方式提取和填充二维矩阵中的块。换句话说,如果
originalImage=[A1 A2;A3 A4],然后
块(:,:,1)=A1
块(:,:,2)=A2,等等。

您可能会发现这很有用:(或旧版本中的blkproc)。我对单元格一无所知。谢谢