2015-03-02 57 views
4

您好亲爱Matlab的专家,重塑阵列,排序逐行对于每个图像

我有图像的阵列,假设一个2×3网格的图像(6个图像)。每张图片的分辨率为4 x 4(为简单起见)。可以说图像是灰度的。

予加载的图像转换成一个4D矩阵尺寸为2×3×4×4。现在我想创建的条目的列向量

1:在图像的第一行的第一像素1,1

2:在图像的第一行的第二像素1,1

3:...

16:在图像1最后一行的最后一个像素,1

17:第一像素第一排在图片2中,1

...

等模式。我能成功地与一帮的for循环创建此:

for imageX = 1 : resolution(2) 
    for imageY = 1 : resolution(1) 
     for pixelX = 1 : resolution(4) 
     for pixelY = 1 : resolution(3) 

       % linear index for 4D indices 
       row = ((imageY - 1) * resolution(2) + imageX - 1) * resolution(3) * resolution(4) + ... 
        (pixelY - 1) * resolution(4) + pixelX; 

       lightFieldVector(row) = lightField(imageY, imageX, pixelY, pixelX); 
     end 
     end 
    end 
end 

如果循环的这个丑陋的堆可以由几个reshapepermute操作来代替我想知道。我认为是这样,但我无法找到正确的顺序。我几次使用这些方法,但只能使用2D矩阵。从文档中我可以得出结论,重塑将会'列第一',所以这将是我需要的相反。

我感谢您的帮助, 阿德里安

回答

4

这应该是正确的顺序 -

lightFieldVector = reshape(permute(lightField,[4 3 2 1]),[],1) 

在这里,整个该剧讲述的是在MATLAB知道linear indexingpermute


相反的过程 -

R = resolution 
lightField = permute(reshape(lightFieldVector,R(4),R(3),R(2),R(1)),[4 3 2 1]) 
+0

哇,这是一个非常快的答案! – aeduG 2015-03-02 21:23:28

+0

逆向过程如何?它会是这样的:lightField = permute(reshape(lightFieldVector,resolution),[4,3,2,1]); ? – aeduG 2015-03-02 21:29:30

+2

难道你不知道光速是在Divakar之后受到启发吗? (哈哈笑话)。 +1 – rayryeng 2015-03-02 21:34:16