convolve2d和filter2D之间的差异。为什么输出形状有所不同?

我需要执行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列?
grx000 回答:convolve2d和filter2D之间的差异。为什么输出形状有所不同?

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

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

更新:将图像与内核卷积时,由于缺少一些邻居,因此无法直接计算图像边缘的卷积结果。解决此问题的方法有多种

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

关于模式名称:
1-如果选择“填充方式”,并保持输出大小与输入大小相同,则称为相同卷积。通过上面的填充方法,可以通过在放大的图像上放置外部值来实现。
2-如果选择“忽略边值方式”进行卷积,则输出将较小。这称为有效卷积。顾名思义,您只在“有效”区域执行卷积操作。
3-如果选择“填充方式”并同时保留附加值,则称为 full 卷积。注意,通过裁剪完整卷积的输出,您也可以获得相同和有效的卷积。

本文链接:https://www.f2er.com/3133612.html

大家都在问