np.outer如何帮助创建过滤器内核?

时间:2019-03-02 07:13:18

标签: python numpy opencv image-processing computer-vision

我正在使用自己的内核尝试使用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)

我不确定第二种方法是做什么的?这里到底发生了什么?

1 个答案:

答案 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')                         

original image 原始图片

1D kernel applied vertically 一维内核垂直应用

1D kernel applied horizontally 一维内核水平应用

1D kernel applied twice 一维内核垂直应用,然后水平应用

使用2D外积内核可以一口气实现相同的效果

# create 2D kernel using outer product
>>> kernel2d = np.outer(kernel, kernel)
>>> f_outer = ndimage.convolve(f, kernel2d[..., None], mode='constant')

2D kernel used 使用2D内核

difference 从差异图片可以看出,最后两个操作是等效的