【问题标题】:Difference between convolve2d and filter2D. Why is there a difference in output shapes?convolve2d 和 filter2D 之间的区别。为什么输出形状有差异?
【发布时间】:2019-11-09 07:57:20
【问题描述】:

我需要执行 2D 卷积。我有一个形状为100, 100 的相似矩阵和一个形状为5,5 的过滤器。

如果我使用 scipy:

scipy.signal.convolve2d(similarity_matrix, np.diag(filter))

我得到104,104 矩阵作为响应。

但如果我确实使用 OpenCV 的 filter2D 方法:

cv2.filter2D(similarity_matrix, -1, np.diag(filter))

我得到一个100,100 矩阵作为响应。

  • 这里发生了什么?为什么形状会有差异?
  • 为什么使用 convolve2d 我会得到 4 个额外的行和 4 个额外的列?

【问题讨论】:

    标签: python numpy opencv scipy convolution


    【解决方案1】:

    scipy.signal.convolve2d的默认输出模式是全卷积。如果您希望输出大小与输入大小相同,请将模式参数设置为“相同”。

    scipy.signal.convolve2d(similarity_matrix, np.diag(filter), mode="same")
    

    更新:当你用内核对图像进行卷积时,你不能直接计算图像边缘的卷积结果,因为缺少一些邻居。有不同的方法来解决这个问题

    1- 忽略边缘的值,例如。如果你的内核是 3x3,忽略边缘的元素,如果你的内核是 5x5,忽略边缘的最后 2 个元素等等。
    2-对图像应用某种填充,这意味着以特定方式暂时放大图像,以便您可以将卷积核应用于边缘的值。同样,有不同的方法可以做到这一点(这次不止 2 种),但最基本的方法是零填充。例如,如果您的图像尺寸为 100x100,而您的内核为 5x5,则在图像的每一侧(右、上、左、下),由于缺少邻居,我们无法计算两个外部值的卷积。使用零填充方法,您首先将图像放大到 104x104。这个放大的图像由中心的原始 100x100 图像和添加到边缘的一些零值组成,现在主要的是现在您可以将过滤器应用于 100x100 区域,因为您为边缘值创建了人工邻居。

    关于模式名称:
    1- 如果您选择“填充方式”并保持输出大小与输入大小相同,则称为 same 卷积。使用上面的填充方法,这是通过在放大的图像上删除外部值来完成的。
    2-如果您选择“忽略边缘值方式”进行卷积,您的输出会更小。这称为有效卷积。顾名思义,您只对“有效”区域进行了卷积操作。
    3-如果您选择“填充方式”并保留附加值,则称为 full 卷积。请注意,通过裁剪全卷积的输出,您也可以获得相同且有效的卷积。

    【讨论】:

    • 你能解释一下全卷积是什么意思吗?
    【解决方案2】:

    Amanda,全卷积包括zero-padding。换句话说,您必须移除越界像素:

    res=scipy.signal.convolve2d(similarity_matrix, np.diag(filter))
    w,h=res.shape()
    res=res[w-2][w-2]
    

    【讨论】:

      猜你喜欢
      • 2020-03-01
      • 1970-01-01
      • 2019-01-14
      • 1970-01-01
      • 2010-12-21
      • 1970-01-01
      • 1970-01-01
      • 2017-03-16
      • 1970-01-01
      相关资源
      最近更新 更多