在matlab中对2d MATRIX进行下采样,采用平均块方式

时间:2015-04-10 17:15:54

标签: matlab matrix downsampling

假设我有一个矩阵A,其尺寸为4x4。

现在我想将这个矩阵下采样2倍,得到一个维数为2x2的新矩阵B.

我想以下列方式进行下采样:

让A成为

 1     5     9    13
 2     6    10    14
 3     7    11    15
 4     8    12    16

我希望B成为

3.5000   11.5000
5.5000   13.5000 

得到B(1,1)=我取平均值(1,5,2和6)

得到B(1,2)=我取平均值(9,13,10和14)

获得B(2,1)=我取平均值(3,7,4和8),等等。

因此,对于B中的每个元素,我从A中取出相应的2x2块并取其平均值。

在我的情况下,矩阵A的尺寸很大。 此外,下采样因子可以是任意的。

例如, A =

 1     7    13    19    25    31
 2     8    14    20    26    32
 3     9    15    21    27    33
 4    10    16    22    28    34
 5    11    17    23    29    35
 6    12    18    24    30    36

对于尺寸为3/2的下采样。<​​/ p>

Matrix B的大小为4x4。

对于每个B单位,我必须采用非重叠的1.5x1.5块A.

例如,

B(1,1)=平均值(1,0.5x7,0.5x2,0.5x8)

B(2,1)=平均值(0.5x2,0.5x8,3,9)

B(3,1)=平均值(4,0.5x10,0.5x5,0.5x11)

B(4,1)=平均值(0.5x5,0.5x11,6,12)

等等。

如果没有for循环,有没有更快的方法呢?

2 个答案:

答案 0 :(得分:2)

这个怎么样:

A = [1     5     9    13;
 2     6    10    14;
 3     7    11    15;
 4     8    12    16];

B = ones(2)/4;

out = conv2(A,B,'valid');

%{
out = [3.5000    7.5000   11.5000;
4.5000    8.5000   12.5000;
5.5000    9.5000   13.5000];
%}

这比您要求的更多,但您可以丢弃您不需要的信息。对于这种情况,您只对out(1,1),out(1,3)out(3,1)和out(3,3)感兴趣

答案 1 :(得分:1)

如果您有图像处理工具箱,则可以使用blockproc

fun = @(block_struct) mean2(block_struct.data) * ones(size(block_struct.data));
B = blockproc(A,[2 2],fun);

B = reshape(unique(B),2,[])

输出:

A =

     1     5     9    13
     2     6    10    14
     3     7    11    15
     4     8    12    16


B =

          3.5         11.5
          5.5         13.5

您可以根据需要更换块大小。请注意,对于非整数因子,MATLAB将截断它们。