【问题标题】:What does scipy.signal.convolve2d calculate? [duplicate]scipy.signal.convolve2d 计算什么? [复制]
【发布时间】:2017-01-12 12:23:22
【问题描述】:

我目前对

的输出有点困惑
#!/usr/bin/env python

import scipy.signal

image = [[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, 41, 42],
         [43, 44, 45, 46, 47, 48, 49]]

filter_kernel = [[-1, 1, -1],
                 [-2, 3, 1],
                 [2, -6, 0]]

res = scipy.signal.convolve2d(image, filter_kernel,
                              mode='same', boundary='fill', fillvalue=0)
print(res)

原来是

[[  -2   -8   -7   -6   -5   -4   28]
 [   3   -7  -10  -13  -16  -19   14]
 [ -18  -28  -31  -34  -37  -40    0]
 [ -39  -49  -52  -55  -58  -61  -14]
 [ -60  -70  -73  -76  -79  -82  -28]
 [ -81  -91  -94  -97 -100 -103  -42]
 [-101  -61  -63  -65  -67  -69  -57]]

我希望左上角的元素是 3*1 + 1*2 + (-6) *8 + 0*9 = -43(省略填充的零)。

我认为这会将矩阵图像 \in R^{7x7} 通过在左/右和上/下添加一个 0 来扩展为 R^{9x9}。然后我认为filter_kernel 将通过将其“滑动”到image 上来计算。在每个位置,图像中的数字与内核中的数字逐点相乘。九款产品汇总后写入res

但是,它是-2。显然,发生了不同的事情。

【问题讨论】:

  • “我希望左上角的元素是 3*1 + 1*2 + (-6) *8 + 0*9 = -43(省略填充的零)。” 你倒过来了。您必须颠倒内核中值的顺序。

标签: python scipy


【解决方案1】:

卷积反转它所处理的函数之一的方向。检查definition on Wikipedia:一个函数用τ参数化,另一个用-τ参数化。这同样适用于 2D 卷积。

您需要镜像内核以获得预期的结果:

filter_kernel = [[0, -6, 2],
                 [1, 3, -2],
                 [-1, 1, -1]]

res = scipy.signal.convolve2d(image, filter_kernel,
                              mode='same', boundary='fill', fillvalue=0)
print(res[0, 0])
# -43

【讨论】:

  • 内核反转有什么具体原因吗?
  • @CoolCoder 好问题,不容易回答。反转其中一个函数使卷积可交换:如果交换图像和内核,您会得到相同的结果。这通常是一个理想的属性。它在过滤信号的情况下也很有意义。如果内核是脉冲响应,则反转内核类型会对齐信号和内核的“旧”和“新”部分......
猜你喜欢
  • 2014-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-08
  • 2015-11-02
  • 1970-01-01
相关资源
最近更新 更多