Разница между расчетом градиента Сиппи - PullRequest
0 голосов
/ 14 февраля 2019

Настройка

В настоящее время я пытаюсь вычислить градиенты изображения с помощью фильтров sobel.Сначала я использовал функцию scipy.ndimage.sobel через

sx = ndimage.sobel(im, axis=0,mode="constant")
sy = ndimage.sobel(im, axis=1,mode="constant")
sobel = np.hypot(sx,sy)
sobel *= 255 / np.max(sobel)

Однако для моего изображения применяется только фильтр sobel (3x3), но я хочу попробовать фильтр большего размера.Поэтому я попытался вычислить градиент изображения с numpy и scipy.signal.Сначала я попробовал (3x3) фильтр снова.

filter_x = np.array([[-1,0,1],[-2,0,2],[-1,0,1]], dtype=np.float)
filter_y = np.array([[1,2,1], [0,0,0], [-1,-2,-1]], dtype = np.float)
sx = signal.convolve2d(im,filter_x,mode="same",boundary="symm", fillvalue=0)
sy = signal.convolve2d(im,filter_y,mode="same",boundary="symm", fillvalue=0)
sobel = np.hypot(sx,sy)
sobel *= 255 / np.max(sobel)

как предложено в этом посте.

Задача

К сожалению, эти два подхода приводят к совершенно разным результатам, о которых уже упоминалось в этом вопросе.Поэтому я покопался немного глубже и обнаружил, что scipy.ndimage.sobel использует функцию correlate1d вместо convolve2d или что-то подобное (исходный код) .К сожалению, заглянуть внутрь кода souce для функции correlate1d невозможно, поскольку ее функциональные возможности скрыты внутри уже скомпилированного файла _nd_image.pyd в папке site-packages моей среды conda.Итак, вот мой вопрос:

Вопрос

Кто-нибудь точно знает, что именно рассчитывается по correlate1d и каким образом оно сопоставимо с convolve2d?

Редактировать

Как уже упоминалось в ответе Флориана Дайнича, можно уметь заменить свертку корреляцией.Но опять же, как появляются эти разные результаты?!

1 Ответ

0 голосов
/ 14 февраля 2019

Судя по именам методов 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)

enter image description here

Сначала давайте определим ядро ​​обнаружения края 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')

enter image description here

... и увеличим грань:

plt.imshow(img_convolved[100:150,100:150], cmap='gray')

enter image description here

Теперь давайте сопоставим изображение с нашим ядром, используя sicpy's signal.correlate2d

img_correlated = signal.correlate2d(img, g)
plt.imshow(img_correlated, cmap='gray')

enter image description here

... и увеличьте грань:

plt.imshow(img_correlated[100:150,100:150], cmap='gray')

enter image description here

Наконец, давайте сравним результат корреляциис тем, что произойдет, если мы сделаем свертку с перевернутым ядром:

img_convolved_flipped = signal.convolve2d(img, np.fliplr(g))
plt.imshow(img_convolved, cmap='gray')

enter image description here

... и увеличим грань:

plt.imshow(img_convolved_flipped[100:150,100:150], cmap='gray')

enter image description here

Итак, 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, но имейте в виду, что это был особый случай.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...