Судя по именам методов correlate1d
и convolve2d
Я бы сильно подозревал, что первое вычисляет корреляцию, а второе вычисляет свертку.В чем разница?
Вообще говоря, свертка сигнала f
с ядром g
включает в себя переворачивание ядра перед операцией: f*g(-t)
Напротив, корреляциясигнал f
с ядром g
выполняется без переворачивания ядра: f*g(t)
Применение ядра для обнаружения направленного фронта (например, sobel ) с использованием свертки должно поэтомурезультат в перевернутых краях по сравнению с результатом с использованием корреляции.Давайте проверим это в коде:
import numpy as np
from scipy import signal
from PIL import Image
from matplotlib import pyplot as plt
img = Image.open('lena.png')
plt.imshow(img)
Сначала давайте определим ядро обнаружения края sobel:
g = np.asarray([[-1, 0, 1],
[-2, 0, 2],
[-1, 0, 1]])
Сейчасдавайте сначала свернем изображение с нашим ядром, используя sicpy's signal.convolve2d
img_convolved = signal.convolve2d(img, g)
plt.imshow(img_convolved, cmap='gray')
... и увеличим грань:
plt.imshow(img_convolved[100:150,100:150], cmap='gray')
Теперь давайте сопоставим изображение с нашим ядром, используя sicpy's signal.correlate2d
img_correlated = signal.correlate2d(img, g)
plt.imshow(img_correlated, cmap='gray')
... и увеличьте грань:
plt.imshow(img_correlated[100:150,100:150], cmap='gray')
Наконец, давайте сравним результат корреляциис тем, что произойдет, если мы сделаем свертку с перевернутым ядром:
img_convolved_flipped = signal.convolve2d(img, np.fliplr(g))
plt.imshow(img_convolved, cmap='gray')
... и увеличим грань:
plt.imshow(img_convolved_flipped[100:150,100:150], cmap='gray')
Итак, scipy's signal.correlate2d(img, g)
эквивалентно signal.convolve2d(img, np.fliplr(g))
EDIT (пояснение для примера 2D-кода):
Обратите внимание, что в двумерном случае свертка сигнала f
с ядром g
включает переворот керNEL вокруг обеих кардинальных осей: f*g(-t,-u)
.
Поэтому в моем коде я должен был дважды щелкнуть по фильтру: np.flipud(np.fliplr(g))
.Я пропустил это, поскольку он не является обязательным для вертикально симметричного фильтра sobel, но имейте в виду, что это был особый случай.