Rearrange block columns back into matrix.
Rearranges columns of the matrix B, representing blocks of size
block_size from a matrix of size A_size, back into its
original size (usually close to A_size. This function is most
useful as reverse operation to im2col.
Blocks are assumed to be from one of two types as defined by
block_type (defaults to "sliding"):
"distinct"Each column of B is assumed to be distinct blocks, with no overlapping elements, of size block_size, to rebuild a matrix of size A_size. Any padding that may have been required to form B from a matrix of A_size, is removed accordingly.
"sliding"This reshapes B into a matrix of size
A_size - block_size +1. Sliding blocks are most useful
to apply a sliding window filter with functions that act along columns.
In this situation, B is usually a row vector, so that if
block_size is [1 1], A_SIZE will be the size of the output
matrix. When converting a matrix into blocks with im2col, there
will be less blocks to account to borders, so if block_size is the
same in both col2im and im2col, A_size can be the size
out the output from im2col.
Blocks are assumed to have been from a matrix, the same direction elements
are organized in an Octave matrix (top to bottom, then left to right), and
the direction that blocks are taken in im2col.
## Get distinct blocks of size [2 3] from A into columns, and ## put them back together into the original position A = reshape (1:24, [4 6]) B = im2col (A, [2 3], "distinct") col2im (B, [2 3], [4 6], "distinct")
## Get sliding blocks of size [2 3] from A into columns, calculate ## the mean of each block (mean of each column), and reconstruct A. ## This is the equivalent to a sliding window filter and ignoring ## borders. A = reshape (1:24, [4 6]) B = im2col (A, [2 3], "sliding") C = mean (B); col2im (C, [1 1], [3 4], "sliding")
See also: blockproc, bestblk, colfilt, im2col, nlfilter, reshape.
The following code
## Divide A using distinct blocks and then reverse the operation
A = [ 1:10
11:20
21:30
31:40];
B = im2col (A, [2 5], "distinct")
C = col2im (B, [2 5], [4 10], "distinct")
Produces the following output
B =
1 21 6 26
11 31 16 36
2 22 7 27
12 32 17 37
3 23 8 28
13 33 18 38
4 24 9 29
14 34 19 39
5 25 10 30
15 35 20 40
C =
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40
The following code
## Get sliding blocks of size from A into columns, calculate the ## mean of each block (mean of each column), and reconstruct A ## after a median filter. A = reshape (1:24, [4 6]) B = im2col (A, [2 3], "sliding") C = mean (B); col2im (C, [1 1], [3 4], "sliding")
Produces the following output
A =
1 5 9 13 17 21
2 6 10 14 18 22
3 7 11 15 19 23
4 8 12 16 20 24
B =
1 2 3 5 6 7 9 10 11 13 14 15
2 3 4 6 7 8 10 11 12 14 15 16
5 6 7 9 10 11 13 14 15 17 18 19
6 7 8 10 11 12 14 15 16 18 19 20
9 10 11 13 14 15 17 18 19 21 22 23
10 11 12 14 15 16 18 19 20 22 23 24
ans =
5.5000 9.5000 13.5000 17.5000
6.5000 10.5000 14.5000 18.5000
7.5000 11.5000 15.5000 19.5000
Package: image