свертка: 2d против 1d 2-проход, давая разные результаты - PullRequest
0 голосов
/ 05 июля 2018

В теории двумерная свертка может быть разделена на: G(x,y)*I = G(x) * G(y)*I

Но когда я попробую это:

import cv2
import scipy.signal as signal
import numpy as np

image = np.random.randint(255, size=(5, 5))
kernel = cv2.getGaussianKernel(13, 2)
kernel_2D = np.outer(kernel, kernel)

result1 = signal.convolve(image, kernel_2D, mode='same')
result2 = signal.convolve(signal.convolve(image, kernel, mode='same'), kernel, mode='same')

result3 = cv2.filter2D(image,-1, kernel_2D, borderType=0)
result4 = cv2.sepFilter2D(image*1.0, -1, kernel, kernel, borderType=0)

Здесь мы видим, что результаты 3 и 4 одинаковы (примечание: функция opencv filter2D вычисляет корреляцию, которая равна свертке, если ядро ​​симметрично, иначе вам придется перевернуть ядро ​​и точку привязки), но вопрос:

Почему не result1 = result2? (т.е. почему результат2 неверен)

1 Ответ

0 голосов
/ 06 июля 2018

Проблема в том, что вы сворачиваете дважды в одном направлении, а не сворачиваете один раз вдоль каждой оси изображения:

result2 = signal.convolve(signal.convolve(image, kernel, mode='same'), kernel.T, mode='same')
#                                                                      ^^^^^^^^

Это дает мне среднюю абсолютную разницу (на пиксель) с result1 в порядке 1e-15.

...