概述
im2col的作用是即重排图像块为矩阵列。
其调用形式为:B = im2col(A,[m n],block_type);
参数说明:
A:要被重排的矩阵;
[m n]:指定分割的小子块矩阵的尺寸;
block_type:子块矩阵分割的方式,可以取值为’distinct’或者’sliding’。“distinct”表示各子块矩阵不重叠,倘若A中有不足以构成[m n]大小的子块,则以0填充。接着将这些子块按列序重排成B矩阵的一个列。“sliding”
B:将A重排后的矩阵。
distinct 型
首先我们输入语句并通过执行语句的结果来分析。那么我们究竟怎样得到的B?
>> A = [1 2 3; 4 5 6; 7 8 9]
A =
1 2 3
4 5 6
7 8 9
>> B = im2col(A, [2 2], 'distinct')
B =
1 7 3 9
4 0 6 0
2 8 0 0
5 0 0 0
观察上图可以看出,由于A是3×3的,并不是子块2×2的整数倍,根据概述,我们需要在A中填充0,使之恰好能被2×2的子块整除,所以填充后的A矩阵为:
1 2 3 0
4 5 6 0
7 8 9 0
0 0 0 0
然后在上面按先行序再列序切割子块,共有4个子块,
1 2
4 5
=============
3 0
6 0
==============
7 8
0 0
==============
9 0
0 0
最后按列排序上面的子块成为B的一列即可。
sliding型
当block_type为sliding时,以子块滑动的方式将A分解成m×n的子矩阵,并将分解以后的子矩阵沿列的方向转换成B的列。子块滑动的方式每次移动一行或者一列。
>> A = [1 2 3; 4 5 6; 7 8 9]
>> B = im2col(X, [2 2], 'sliding')
B =
1 4 2 5
4 7 5 8
2 5 3 6
5 8 6 9
有了前面的讲解应该很容易理解sliding型的,只不过此时的子块之间是有重叠的,而且值得注意的是,子块是先在列上进行滑动,然后才在行方向进行滑动。也形成了4个子块,如下
1 2
4 5
=====在列方向上移动“一步”=========
4 5
7 8
========回到矩阵“顶部”,并在行方向移动一步=================
2 3
5 6
====================
5 6
8 9
然后将上面的子块重排成B的一列即可。