2017-01-12 2 views
1

Я в настоящее время немного смущает выходЧто вычисляет scipy.signal.convolve2d?

#!/usr/bin/env python 

import scipy.signal 

image = [[1, 2, 3, 4, 5, 6, 7], 
     [8, 9, 10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19, 20, 21], 
     [22, 23, 24, 25, 26, 27, 28], 
     [29, 30, 31, 32, 33, 34, 35], 
     [36, 37, 38, 39, 40, 41, 42], 
     [43, 44, 45, 46, 47, 48, 49]] 

filter_kernel = [[-1, 1, -1], 
       [-2, 3, 1], 
       [2, -6, 0]] 

res = scipy.signal.convolve2d(image, filter_kernel, 
           mode='same', boundary='fill', fillvalue=0) 
print(res) 

Это был

[[ -2 -8 -7 -6 -5 -4 28] 
[ 3 -7 -10 -13 -16 -19 14] 
[ -18 -28 -31 -34 -37 -40 0] 
[ -39 -49 -52 -55 -58 -61 -14] 
[ -60 -70 -73 -76 -79 -82 -28] 
[ -81 -91 -94 -97 -100 -103 -42] 
[-101 -61 -63 -65 -67 -69 -57]] 

Я ожидал, что левый верхний элемент будет 3*1 + 1*2 + (-6) *8 + 0*9 = -43 (ommitting плюсованных нулей).

Я думал, что это расширит матричное изображение \ in R^{7x7} до R^{9x9}, добавив один 0 влево/вправо и сверху/снизу. Тогда я подумал, что filter_kernel будет рассчитан путем «скользящего» по image. В каждой позиции числа из изображения по очереди умножаются на числа из ядра. Девять продуктов суммируются и записываются в res.

Однако, это -2. Очевидно, что-то другое происходит.

+0

* "Я ожидал, что левый верхний элемент будет 3 * 1 + 1 * 2 + (-6) * 8 + 0 * 9 = -43 (ommitting padded нули). * * У вас есть это назад. Вы должны изменить порядок значений в ядре. –

ответ

0

Свертка отменяет направление одной из функций, над которыми она работает. Проверьте defitition: одна функция параметризуется τ, а другая - -τ. То же самое относится к двумерной свертке.

Вы должны отражать ядро, чтобы получить ожидаемый resut:

filter_kernel = [[0, -6, 2], 
       [1, 3, -2], 
       [-1, 1, -1]] 

res = scipy.signal.convolve2d(image, filter_kernel, 
           mode='same', boundary='fill', fillvalue=0) 
print(res[0, 0]) 
# -43 
Смежные вопросы