用于ND输入的im2col算法

时间:2016-03-25 18:41:37

标签: matlab image-processing computer-vision

我正在尝试为输入维度编写自己的im2col算法> 2D。 目前我正在研究Matlab im2col的实现。但是,我找不到任何关于超过2维的任何输入的内容的文档。

如果我将3D张量输入函数,我会得到一个输出。但是,我真的不明白你是如何从2D到ND的。事实上,文档中没有提到它表明它是直截了当的,但是,我还没有得到它。

哎呀,我甚至不明白为什么输出矩阵的大小是它的大小。

1 个答案:

答案 0 :(得分:1)

首先我要说im2col仅适用于2D矩阵。事实上,它有时是有效的(我的意思是返回一个结果而不会抛出错误)只是一个快乐的巧合。

现在我看了edit im2col.m,并且没有过多地研究代码,每个distinctsliding方法的第一行应该让你直截了当地发生了什么:

...
if strcmp(kind, 'distinct')
    [m,n] = size(a);
    ...
elseif strcmp(kind,'sliding')
    [ma,na] = size(a);
    ...
end
...

首先回想一下[s1,s2] = size(arr)其中arr是一个3d数组会将第二维和第三维的大小合并为一个大小。这是相关的doc size

  

[d1,d2,d3,...,dn] = size(X)返回数组X的维度大小,前提是输出参数n的数量等于ndims(X)。如果n < ndims(X)di等于X的{​​{1}}的第i维的大小,则0<i<n等于dn的剩余维度的大小的乘积{1}},即维度Xn

所以基本上对于大小为ndims(X)的数组,函数会认为它是一个大小为M-by-N-by-P的矩阵。现在,MATLAB有一些古怪的索引规则,可以让你做到这样的事情:

M-by-(N*P)

这是我认为最终发生的事情。以下是确认>> x = reshape(1:4*3*2,4,3,2) x(:,:,1) = 1 5 9 2 6 10 3 7 11 4 8 12 x(:,:,2) = 13 17 21 14 18 22 15 19 23 16 20 24 >> x(:,:) ans = 1 5 9 13 17 21 2 6 10 14 18 22 3 7 11 15 19 23 4 8 12 16 20 24 在RGB图像上的行为的示例:

im2col

请注意,% normal case (grayscale image) >> M = magic(5); >> B1 = im2col(M, [3 3], 'sliding'); % (RGB image) >> MM = cat(3, M, M+50, M+100); >> B2 = im2col(MM, [3 3], 'sliding'); >> B3 = im2col(reshape(MM, [5 5*3]), [3 3], 'sliding'); >> assert(isequal(B2,B3)) B2相同,所以基本上认为数组B3im2col的结果与arr = cat(3,R,G,B)的结果相同(水平连接)。

有趣的是,使用“distinct”块方法你不会那么幸运:

arr = cat(2,R,G,B)

现在我们已经了解了发生了什么,让我们考虑如何正确地为3D阵列做这件事。

在我看来,为彩色图像实现>> B1 = im2col(M, [3 3], 'distinct') % works % ..snip.. >> B2 = im2col(MM, [3 3], 'distinct') % errors Subscripted assignment dimension mismatch. Error in im2col (line 59) aa(1:m,1:n) = a; ,我会分别在每个颜色通道上运行它(每个都是一个2d矩阵),并沿第三维连接结果。所以像这个包装函数:

im2col