Очень коротко, ваше первое ядро - 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')
исходное изображение
1D ядро, нанесенное вертикально
1D ядро применяется горизонтально
1D ядро применяется вертикально, а затем горизонтально
Мы можем добиться того же эффекта в одномперейти к использованию 2D ядра внешнего продукта
# create 2D kernel using outer product
>>> kernel2d = np.outer(kernel, kernel)
>>> f_outer = ndimage.convolve(f, kernel2d[..., None], mode='constant')
Используется 2D ядро
последние две манипуляции эквивалентны как могутвидно из разностного изображения