如何使用一维卷积完成二维卷积?

时间:2018-10-28 16:02:20

标签: matlab convolution

假设

u = [1 2 1 3 ; 1 2 1 3 ; 1 2 1 3];
v = [2 0 1 ; 2 0 1 ; 2 0 1];

我想实现

w = conv2(u, v);    % [2 4 3 8 1 3 ; 4 8 6 16 2 6 ; 6 12 9 24 3 9 ; 4 8 6 16 2 6 ; 2 4 3 8 1 3]

而且,假设我不想使用conv2()

使用Matlab,我发现了

w1 = conv([1 2 1 3], [2 0 1])   % [2 4 3 8 1 3]
w2 = conv([1 2 1 3], [2 0 1])   % [2 4 3 8 1 3]
w3 = conv([1 2 1 3], [2 0 1])   % [2 4 3 8 1 3]

因此,我们得到:

w123 = [w1 ; w2 ; w3]           % [2 4 3 8 1 3 ; 2 4 3 8 1 3 ; 2 4 3 8 1 3];

使用Matlab,我也发现了

x = [2 ; 2 ; 2]
y = [1 ; 1 ; 1]
z = conv(x, y); % [2 ; 4 ; 6 ; 4 ; 2];

x = [4 ; 4 ; 4]
y = [1 ; 1 ; 1]
z = conv(x, y); % [4 ; 8 ; 12 ; 8 ; 4];

x = [3 ; 3 ; 3]
y = [1 ; 1 ; 1]
z = conv(x, y); % [3 ; 6 ; 9 ; 6 ; 3];

x = [8 ; 8 ; 8]
y = [1 ; 1 ; 1]
z = conv(x, y); % [8 ; 16 ; 24 ; 16 ; 8];

x = [1 ; 1 ; 1]
y = [1 ; 1 ; 1]
z = conv(x, y); % [1 ; 2 ; 3 ; 2 ; 1];

x = [3 ; 3 ; 3]
y = [1 ; 1 ; 1]
z = conv(x, y); % [3 ; 6 ; 9 ; 6 ; 3];

这意味着,如果我们对内核为u的{​​{1}}的每一行执行一维卷积,然后对内核为[2 0 1]的每一列进行一维卷积,则得到:

[1; 1; 1]

所以,我的问题是,这个2 4 3 8 1 3 4 8 6 16 2 6 6 12 9 24 3 9 4 8 6 16 2 6 2 4 3 8 1 3 来自哪里?

最重要的是,如果行不相同会发生什么?

2 个答案:

答案 0 :(得分:3)

一维卷积组合起来可以得到与二维卷积相同的结果的原因是您的过滤器为separable。史蒂夫·埃丁斯(Steve Eddins)在他的MATLAB博客here上讨论了可分卷积。

您的过滤器是可分离的,因为:

[1;1;1] * [2,0,1] = 

   2   0   1
   2   0   1
   2   0   1

但通常,并非所有2D滤波器都是可分离的,只有那些可以被转换为单独的1D卷积。

答案 1 :(得分:0)

我想是因为您的矩阵v只是同一行3次。因此,您可以在列

上简单地对[1 1 1]使用第二次卷积
相关问题