Правильно используя сверток numpy с изображением - PullRequest
1 голос
/ 06 апреля 2019

Я смотрел видео Эндрю Нга на CNN и хотел свернуть 6 x 6 изображение с 3 x 3 фильтром. То, как я подошел к этому с помощью numpy, выглядит следующим образом:

image = np.ones((6,6))
filter = np.ones((3,3))

convolved = np.convolve(image, filter)

Запуск этого сообщения дает ошибку:

ValueError: object too deep for desired array

Я мог бы понять из нудистской документации о свитке о том, как правильно использовать метод convolve.

Кроме того, есть ли способ, которым я мог бы сделать плавные свертки с NumPy?

1 Ответ

1 голос
/ 06 апреля 2019
Функция

np.convolve, к сожалению, работает только для свертки 1-D .Вот почему вы получаете ошибку;вам нужна функция, которая позволяет вам выполнять двумерную свертку.

Однако , даже если она сработала, у вас действительно неправильная операция.То, что называется сверткой в машинном обучении, более правильно называется взаимной корреляцией в математике.Они на самом деле почти одинаковы;Свертывание включает в себя переключение матрицы фильтра с последующим выполнением взаимной корреляции.

Чтобы решить вашу проблему, вы можете посмотреть на scipy.signal.correlate (также не используйте filter в качестве имени, поскольку вы будете затенятьвстроенная функция):

from scipy.signal import correlate

image = np.ones((6, 6))
f = np.ones((3, 3))

correlate(image, f)

Выход:

array([[1., 2., 3., 3., 3., 3., 2., 1.],
       [2., 4., 6., 6., 6., 6., 4., 2.],
       [3., 6., 9., 9., 9., 9., 6., 3.],
       [3., 6., 9., 9., 9., 9., 6., 3.],
       [3., 6., 9., 9., 9., 9., 6., 3.],
       [3., 6., 9., 9., 9., 9., 6., 3.],
       [2., 4., 6., 6., 6., 6., 4., 2.],
       [1., 2., 3., 3., 3., 3., 2., 1.]])

Это стандартная настройка полной взаимной корреляции.Если вы хотите удалить элементы, которые полагались бы на заполнение нулями , передайте mode='valid':

from scipy.signal import correlate

image = np.ones((6, 6))
f = np.ones((3, 3))

correlate(image, f, mode='valid')

Вывод:

array([[9., 9., 9., 9.],
       [9., 9., 9., 9.],
       [9., 9., 9., 9.],
       [9., 9., 9., 9.]])
...