Эквивалент Matlab Conv2 в OpenCV

Я пытался сделать свертку 2D-матрицы с использованием 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]

И результат как от conv2 от Matlab

 -0.7071    2.1213   -1.4142
-2.1213   -0.7071    2.8284

Какая-нибудь функция для вычисления этого вывода в OpenCV или C ++? Буду благодарен за ответ.

2

Решение

Если вы хотите эксклюзивное решение OpenCV, используйте cv2.filter2D функция. Но вы должны настроить флаг borderType, если вы хотите получить правильный вывод, как у matlab.

>>> 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. Смотрите вывод больше по размеру, чем вход.

4

Другие решения

Если вы используете 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.

0

По вопросам рекламы [email protected]