2

假设我有一个矩阵 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 and 6)

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

为了得到 B(2,1) = 我取平均值 (3, 7, 4 and 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 的下采样。

矩阵 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循环有没有更快的方法来做到这一点?

4

2 回答 2

3

这个怎么样:

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) 感兴趣

于 2015-04-10T17:37:21.677 回答
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 将截断它们。

于 2015-04-10T17:51:29.000 回答