Matlab在OpenCV中的Conv2等价物

时间:2013-04-21 16:51:36

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

我一直在尝试使用OpenCV进行2D矩阵的卷积。我实际上已经完成了这段代码http://blog.timmlinder.com/2011/07/opencv-equivalent-to-matlabs-conv2-function/#respond,但只有在正面情况下它才会产生正确的答案。在Matlab中是否有一个像conv2这样的简单函数用于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 ++中计算此输出的一些功能?我将非常感谢您的回复。

2 个答案:

答案 0 :(得分:4)

如果您想要独家的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。请参阅输出的大小大于输入。

答案 1 :(得分:0)

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

>>> 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的方式居中。