【问题标题】:How does np.outer help in creating a filter kernel?np.outer 如何帮助创建过滤器内核?
【发布时间】:2019-03-02 07:13:18
【问题描述】:

我正在使用我自己的内核在 OpenCV 中尝试 filter2D 函数:

kernel = np.array([1,3,4,5,2]) / 11

cv2.filter2D(img, -1, kernel)

而且效果很好。我还看到了一个sn-p,同样的事情是这样完成的:

kernel = np.array([1,3,4,5,2]) / 11
kernel = np.outer(kernel, kernel)

cv2.filter2D(img, -1, kernel)

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

【问题讨论】:

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


    【解决方案1】:

    非常简单,您的第一个内核是一维内核,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 内核

    从差异图像中可以看出,最后两个操作是等价的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多