2011-06-08 267 views
6

我正在从事图像处理项目MATLAB。为了更容易地预处理图像,我已经将它分成行和列,所以从原始图像(2D uint8矩阵)开始,现在我有一个3D矩阵,就像一个堆栈。MATLAB - 合并子矩阵

Image decomposition

处理每个块之后,我想再次重新构图。问题是行数和列数是动态的,所以我不能使用(或不知道如何在这里使用它)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

您可能会发现这有用:http://www.mathworks.com/help/toolbox/images/ref/blockproc.html(或旧版本的blkproc )。 – 2011-06-08 19:51:32

回答

3

如果我正确地理解你的问题,然后这是我会怎么做: 假设我们有尺寸米的一些数据矩阵由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'功能。

+0

我没有关于细胞的线索。谢谢! – 2011-06-08 21:38:53

1

关于你如何根据你的图在一个2-D矩阵和一个3-D矩阵之间来回转换的具体问题,我首先假设originalHeightoriginalWidth可以被numRowsnumCols。在a solution I gavea similar problem先前要求的基础上,这里是只能用一个解决方案重塑和矩阵排列:

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

注意的是,在3 d矩阵块沿第三维连接在一起,所以blocks(:,:,i)是来自2-D矩阵的块。还要注意,这些解决方案将以行方式提取和填充2D矩阵中的块。换句话说,如果originalImage = [A1 A2; A3 A4];,那么blocks(:,:,1) = A1;,等