【问题标题】:Matlab's Conv2 equivalent in OpenCVOpenCV 中的 Matlab Conv2 等效项
【发布时间】:2013-04-14 13:28:35
【问题描述】:

我一直在尝试使用 OpenCV 对 2D 矩阵进行卷积。我实际上经历了这段代码http://blog.timmlinder.com/2011/07/opencv-equivalent-to-matlabs-conv2-function/#respond,但它只在肯定的情况下产生正确的答案。对于 OpenCV 或 C++,Matlab 中是否有像 conv2 这样的简单函数?

这是一个例子:

A= [
  1 -2
  3  4
]

我想将它与[-0.707 0.707]进行卷积

Matlab 中 conv2 的结果是

 -0.7071    2.1213   -1.4142
 -2.1213   -0.7071    2.8284

在 OpenCV 或 C++ 中计算此输出的某些函数?我将不胜感激。

【问题讨论】:

  • 你可以使用 filter2d()
  • 我试过了,但没有给出所需的答案。

标签: c++ image opencv image-processing convolution


【解决方案1】:

如果您使用 OpenCV 和 Python 2 绑定,只要您的图像是 ndarrays,您就可以使用 Scipy:

>>> from scipy import signal
>>> A = np.array([[1,-2], [3,4]])
>>> B = np.array([[-0.707, 0.707]])
>>> signal.convolve2d(A,B)
array([[-0.707,  2.121, -1.414],
      [-2.121, -0.707,  2.828]])

如果您想获得与在 matlab 中相同的结果,请确保使用完整模式(默认设置),只要您使用“相同”模式,Scipy 的中心将与 Matlab 不同。

【讨论】:

    【解决方案2】:

    如果您想要一个专属的 OpenCV 解决方案,请使用 cv2.filter2D 函数。但是如果你想得到像matlab那样正确的输出,你应该调整borderType标志。

    >>> A = np.array([ [1,-2],[3,4] ]).astype('float32')
    >>> A
    array([[ 1., -2.],
           [ 3.,  4.]], dtype=float32)
    
    >>> B = np.array([[ 0.707,-0.707]])
    >>> B
    array([[ 0.707, -0.707]])
    
    >>> cv2.filter2D(A2,-1,B,borderType = cv2.BORDER_CONSTANT)
    array([[-0.70700002,  2.12100005, -1.41400003],
           [-2.12100005, -0.70700002,  2.82800007]], dtype=float32)
    

    borderType 很重要。要找到卷积,您需要数组之外的值。如果你想得到类似matlab的输出,你需要通过cv2.BORDER_CONSTANT。看到输出大于输入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-01
      • 2014-08-05
      • 1970-01-01
      • 1970-01-01
      • 2022-10-06
      相关资源
      最近更新 更多