Как np.outer помогает в создании ядра фильтра? - PullRequest
0 голосов
/ 02 марта 2019

Я пробовал функцию filter2D с OpenCV, используя мое собственное ядро:

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 голосов
/ 02 марта 2019

Очень коротко, ваше первое ядро ​​- 1D, np.outer создает двумерное ядро.

Более подробно: (У меня нет открытого 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')                         

original image исходное изображение

1D kernel applied vertically 1D ядро, нанесенное вертикально

1D kernel applied horizontally 1D ядро ​​применяется горизонтально

1D kernel applied twice 1D ядро ​​применяется вертикально, а затем горизонтально

Мы можем добиться того же эффекта в одномперейти к использованию 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 последние две манипуляции эквивалентны как могутвидно из разностного изображения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...