非常简单,您的第一个内核是一维内核,np.outer 创建一个二维内核。
更详细地说:(我没有 open cv,我正在使用 scipy / PIL 代替,但这本质上应该是等效的。)
>>> import numpy as np
>>> from scipy import misc, ndimage
>>>
# get example image, decimate it a bit
>>> f = misc.face()[::4,::4]
>>>
# create a simple 1D kernel (a triangle)
>>> kernel = 16 - np.abs(np.arange(-15, 16))
>>> kernel = kernel / kernel.sum()
>>>
>>> f_vert = ndimage.convolve1d(f, kernel, axis=0, mode='constant')
>>> f_horz = ndimage.convolve1d(f, kernel, axis=1, mode='constant')
>>> f_both = ndimage.convolve1d(f_vert, kernel, axis=1, mode='constant')
原图
垂直应用的一维内核
水平应用一维内核
一维内核垂直应用,然后水平应用
使用2D外积核我们可以一次性达到同样的效果
# create 2D kernel using outer product
>>> kernel2d = np.outer(kernel, kernel)
>>> f_outer = ndimage.convolve(f, kernel2d[..., None], mode='constant')
使用 2D 内核
从差异图像中可以看出,最后两个操作是等价的