Как свертывать изображения с помощью Scipy - PullRequest
0 голосов
/ 01 декабря 2018

В чем разница между scipy.signal.convolve и scipy.ndimage.convolve?Разница: signal против ndimage

Я провел эксперимент, свернув одно изображение с одним фильтром, но с двумя различными функциями.В результате получилось два совершенно разных изображения.Как это могло произойти?

Это мой фильтр:

B = np.full((3,3), -1)
B[1][1] = 8

Вот мои результаты: enter image description here enter image description here

Еще одна вещь: почему scipy.ndimage.convolve работает намного быстрее, чем scipy.signal.convolve?enter image description here

Еще один вопрос: чем scipy.signal.convolve отличается от scipy.signal.convolve2d?

1 Ответ

0 голосов
/ 01 декабря 2018

Основное различие заключается в том, что d-тип вывода определяется по аргументам.

Из кода, который вы выложили, я подозреваю, что ваше изображение имеет тип dtype uint8, а ядро ​​- int.

import numpy as np
from scipy import signal, ndimage
from scipy.misc import face

bw = face()[..., 0]
filter = np.full((3, 3), -1)
filter[1, 1] = 8

bw.dtype
# dtype('uint8')
filter.dtype
# dtype('int64')

В этой ситуации выходные типы dtypes:

sig = signal.convolve(bw, filter, 'same')
ndi = ndimage.convolve(bw, filter)
sig.dtype
# dtype('int64')
ndi.dtype
# dtype('uint8')

Помимо этого и различных граничных условий результаты фактически одинаковы:

np.all(sig.astype(np.uint8)[1:-1,1:-1] == ndi[1:-1,1:-1])
# True

Отображаемоеизображения выглядят совершенно иначе, по-видимому, из-за переполнения в uint8 арифметике.

...