2017-04-07 236 views
0

我有尺寸爲400 x 500的二維矩陣,每個矩陣都顯示一個圖像。我的過程包含兩個步驟:使用matlab將3d矩陣轉換爲4d矩陣

1)I不得不分割矩陣分割這些圖像(以相等大小的子矩陣)

2)I具有到每個這些分割保存在一個矩陣

第一步驟完成,矩陣變化的尺寸從2D→3D(最後一個索引顯示分割索引)

現在對於步驟2我有100個圖像,我想要有4維的矩陣,最後一個索引顯示圖片數量

s充足:訪問圖像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

如果你在'T'新圖像的3D矩陣,你能不能存儲此通過改變你的最後一行到'Im(:,:,:,i-2)= T',在'Im'中? – Wolfie

+0

@Wolfie我試過,但沒有答案! – mkafiyan

+0

來自Python,正準備告訴你修復你的縮進:) –

回答

0

reshape挑選列主要排序中的元素,因此您可能必須編寫令人費解的代碼才能使其工作。而不是去使用permutereshape來創建4D矩陣,並可能遇到內存不足的問題,我會建議使用mat2cell將矩陣拆分成單元陣列,因爲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 

你可以遍歷所有的圖像,並創建一個三維單元陣列,其中陣列中的每個層代表每個圖像分割成塊的例子。我會建議預先分配你的數組,並將矩陣分配到循環內正確的層中,而不是遞增地增加矩陣的大小。

也有似乎是一個圖像處理工具箱中特定的功能做你正在嘗試:檢查:How to divide an image into blocks in MATLAB?