Matlab在OpenCV中的Conv2等效物

Matlab's Conv2 equivalent in OpenCV

本文关键字:Conv2 中的 OpenCV Matlab      更新时间:2023-10-16

我一直在尝试使用OpenCV做二维矩阵的卷积。我实际上检查了这段代码http://blog.timmlinder.com/2011/07/opencv-equivalent-to-matlabs-conv2-function/#respond但它只在正的情况下才会得到正确的答案。是否有一个简单的函数,如conv2在Matlab的OpenCV或c++ ?

下面是一个例子:

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++中计算输出的一些函数?

如果您想要独占的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。

如果你正在使用OpenCV与Python 2绑定,你可以使用Scipy,只要你的图像将是ndarray:

>>> 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的中心不同。