如何使用scipy对图像进行卷积

时间:2018-12-01 18:46:06

标签: python image numpy scipy convolution

scipy.signal.convolvescipy.ndimage.convolve有什么区别?区别:signalndimage

我做了一个实验,对具有一个滤镜的一个图像进行卷积,但是具有两个不同的功能。这导致了两个完全不同的图像。那怎么会发生?

那是我的过滤器:

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

这是我的结果: enter image description here enter image description here

还有一件事:为什么scipy.ndimage.convolvescipy.signal.convolve快得多? enter image description here

另一个问题:scipy.signal.convolvescipy.signal.convolve2d有什么不同?

1 个答案:

答案 0 :(得分:1)

主要区别似乎在于如何根据参数确定输出的dtype。

从您发布的代码中,我怀疑您的映像是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')

在这种情况下,输出dtype为:

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算法的溢出。