2011-06-08 265 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;,等