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

How to rearrange each image patch into number of column vector

我正在做一个项目,我使用了一个大小为 (512x512) 的图像,然后我将整个图像除以 8,这样就会有 64x64 块,然后我必须将每个 8x8 图像块重新排列成一个单列,以便新的大小 64x4069。无法理解如何做 it.please 帮助。 这是我的代码

在此处输入代码

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)。

如果reshape is allowed, 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,[]));