我正在使用自己的内核尝试使用OpenCV的filter2D函数:
kernel = np.array([1,3,4,5,2]) / 11
cv2.filter2D(img, -1, kernel)
,效果很好。我还看到了一个片段,其中的相同操作如下:
kernel = np.array([1,3,4,5,2]) / 11
kernel = np.outer(kernel, kernel)
cv2.filter2D(img, -1, kernel)
我不确定第二种方法是做什么的?这里到底发生了什么?
答案 0 :(得分:4)
很简单,您的第一个内核是1D,np.outer创建一个2D内核。
更多细节:(我没有开放的简历,我使用的是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')