如何使用 scipy 对图像进行卷积
How to convolve images using scipy
scipy.signal.convolve
和scipy.ndimage.convolve
有什么区别?差异:signal
与 ndimage
我做了一个实验,将 one 图像与 one 过滤器进行卷积,但具有两个不同的函数。结果产生了两个完全不同的图像。怎么会这样?
这是我的过滤器:
B = np.full((3,3), -1)
B[1][1] = 8
这是我的结果:
还有一件事:为什么 scipy.ndimage.convolve
比 scipy.signal.convolve
工作得快得多?
另一个问题:scipy.signal.convolve
与 scipy.signal.convolve2d
有何不同?
主要区别似乎在于如何根据参数确定输出的 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')
在这种情况下,输出数据类型为:
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
算术溢出,渲染的图像看起来大不相同。
scipy.signal.convolve
和scipy.ndimage.convolve
有什么区别?差异:signal
与 ndimage
我做了一个实验,将 one 图像与 one 过滤器进行卷积,但具有两个不同的函数。结果产生了两个完全不同的图像。怎么会这样?
这是我的过滤器:
B = np.full((3,3), -1)
B[1][1] = 8
这是我的结果:
还有一件事:为什么 scipy.ndimage.convolve
比 scipy.signal.convolve
工作得快得多?
另一个问题:scipy.signal.convolve
与 scipy.signal.convolve2d
有何不同?
主要区别似乎在于如何根据参数确定输出的 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')
在这种情况下,输出数据类型为:
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
算术溢出,渲染的图像看起来大不相同。