首页 > 解决方案 > np.outer 如何帮助创建过滤器内核?

问题描述

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

我不确定第二种方法有什么作用?这里到底发生了什么?

标签: pythonnumpyopencvimage-processingcomputer-vision

解决方案


很简单,你的第一个内核是一维的, np.outer 创建一个二维内核。

更详细地说:(我没有打开的简历,我使用的是 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 内核 使用的 2D 内核

不同之处 从差异图像中可以看出,最后两个操作是等效的


推荐阅读