【问题标题】:How to accomplish 2D convolution using 1D convolution?如何使用 1D 卷积完成 2D 卷积?
【发布时间】:2018-10-28 16:02:19
【问题描述】:

假设,

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];

也就是说,如果我们用内核[2 0 1]u的每一行进行一维卷积,然后用内核[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

那么,我的问题是,这个[1 ; 1 ; 1] 来自哪里?

而且,最重要的是,如果行不同会怎样?

【问题讨论】:

  • 您当天的搜索词是Separable Convolution Filter
  • @beaker,因此,简而言之:2d 卷积通常无法从 1d 卷积中实现。除非内核是可分离的。
  • 这是正确的
  • @beaker,发表您的评论作为答案,我会接受。

标签: matlab convolution


【解决方案1】:

你的一维卷积结合起来给你与二维卷积相同的结果的原因是你的过滤器是separable。 Steve Eddins 在他的 MATLAB 博客 here 上讨论了可分离卷积。

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

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

   2   0   1
   2   0   1
   2   0   1

但一般来说,并非所有 2D 过滤器都是可分离的,只有那些可以变成单独的 1D 卷积的过滤器。

【讨论】:

    【解决方案2】:

    我想是因为您的矩阵 v 是同一行 3 次。因此,您可以简单地在列上使用带有[1 1 1] 的第二次卷积

    【讨论】:

    • 如果不一样怎么办?
    • 未经测试我会假设如果行只是彼此的线性组合,那么您可以使用这种方法并为每行提供适当的因素。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    • 1970-01-01
    • 2017-07-25
    • 2014-05-18
    • 2020-11-01
    • 1970-01-01
    相关资源
    最近更新 更多