如何使用for循环将矩阵列重新排列为块?

时间:2015-06-04 01:50:30

标签: matlab image-processing

我正在开发一个项目,我使用的图像大小为(512x512),然后我将整个图像分割为8,这样就会有64x64块,然后我将每个8x8图像补丁重新排列成一列我的新尺寸是64x4069。 现在我想恢复原来的尺寸,即512x512,请帮我如何使用for循环取代它而不是' col2im'

a=imread('lena.png');
b=double(a);
[m,n] = size(b);
bl=8;
br=m/bl;
bc=n/bl;
out = zeros(size(reshape(b,bl*bl,[])));
count = 1;
for i = 1:br
    for j= 1:bc
        block = b((j-1)*bl + 1:(j-1)*bl + bl, (i-1)*bl + 1:(i-1)*bl + bl);
        out(:,count) = block(:);
        count = count + 1;
    end
end

1 个答案:

答案 0 :(得分:0)

这基本上是你向后写的脚本。必须做出一些假设,因为不是每个矩形矩阵都可能来自您描述的过程,也因为原始矩阵的尺寸不能从块集中唯一确定。所以,我假设原始矩阵是方形矩阵,块也是正方形。

顺便说一下,在你的代码中,你在行索引的公式中使用j,在列中使用i;我认为这是一个错误,并在下面进行了修改。

out = kron((0:3)', 1:16);   % for testing; you would have a 64x4096 matrix here
[m,n] = size(out);
osize = sqrt(n*m); 
bl = sqrt(m);
br = osize/bl;
bc = br;
original = zeros(osize);
count = 1;
for i = 1:br
    for j = 1:bc
        block = zeros(bl);
        block(:) = out(:,count);
        original(1+(i-1)*bl : i*bl, 1+(j-1)*bl : j*bl) = block;
        count = count + 1;
    end
end

测试输入:

 0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
 1     2     3     4     5     6     7     8     9    10    11    12    13    14    15    16
 2     4     6     8    10    12    14    16    18    20    22    24    26    28    30    32
 3     6     9    12    15    18    21    24    27    30    33    36    39    42    45    48

输出:

 0     2     0     4     0     6     0     8
 1     3     2     6     3     9     4    12
 0    10     0    12     0    14     0    16
 5    15     6    18     7    21     8    24
 0    18     0    20     0    22     0    24
 9    27    10    30    11    33    12    36
 0    26     0    28     0    30     0    32
13    39    14    42    15    45    16    48