如何将每个图像块重新排列成列向量的数量

时间:2015-06-03 01:55:00

标签: matlab image-processing

我正在开发一个项目,我使用的图像大小为(512x512)然后我将整个图像分割为8,这样就会有64x64块然后我必须将每个8x8图像补丁重新排列成一列这样新的尺寸就可以了 64x4069。无法理解如何做到这一点。请帮助。 这是我的代码

在这里输入代码

a=imread('lena.png');
b=double(a);
[r,c]=size(b);
bl=8;
br=r/bl;
bc=r/bl;

它将按照这样的顺序排列第一列将是(1:8,1:8)的图像补丁,下一列也是(9:16,9:16)。

1 个答案:

答案 0 :(得分:0)

如果允许reshape,则绝对允许permute

假设原始子块和块子矩阵都是方形矩阵

这是一种方法

out = permute(reshape(A,blSz,size(A,1)/blSz,blSz,[]),[1 3 2 4]);
out = reshape(out,size(out,1)*size(out,1),[]);

示例输入:

A = randi(50,8);    %// Change it with your original `512x512` matrix
blSz = 2;           %// Change it to 8 for your problem

<强>结果:

>> A

A =

31    17    18    10    33    31    43    16
20    40    31    15    34    23    42     6
46    24    10     5    32    23    13    47
 1     2    37    29    48    34    31    33
24     9    13    35    11    39    30    24
22    37    46    28    36    18    28    32
24    24    14    22    12    34    44    28
39     8    39    33     6    21    14    33

>> out

out =

31    46    24    24    18    10    13    14    33    32    11    12    43    13    30    44
20     1    22    39    31    37    46    39    34    48    36     6    42    31    28    14
17    24     9    24    10     5    35    22    31    23    39    34    16    47    24    28
40     2    37     8    15    29    28    33    23    34    18    21     6    33    32    33

使用循环作为OP请求

A = randi(50,8);
blSz = 2;
nBl = size(A,1)/2;

out = zeros(size(reshape(A,blSz*blSz,[])));
count = 1;
for ii = 1:nBl
    for jj= 1:nBl
        block = A((jj-1)*blSz + 1:(jj-1)*blSz + blSz, (ii-1)*blSz + 1:(ii-1)*blSz + blSz);
        out(:,count) = block(:);
        count = count + 1;
    end
end

给出与上面相同的结果!

使用矢量化方法替代im2col

newOut = mat2cell(reshape(out,blSz,[]),blSz,repmat(blSz,size(out,2),1));
newOut = cell2mat(reshape(newOut,nBl,[]));