Как я могу определить, отделима ли моя свертка? - PullRequest
20 голосов
/ 04 мая 2011

Что делает ядро ​​свертки отделимым? Как бы я мог сказать, что это за отдельные части, чтобы сделать две одномерные свертки вместо двухмерной свертки>

Спасибо

Ответы [ 2 ]

18 голосов
/ 04 мая 2011

Если ядро ​​двумерного фильтра имеет rank, равное 1, то оно отделимо.Вы можете проверить это, например, в Matlab или Octave:

octave-3.2.3:1>     sobel = [-1 0 1 ; -2 0 2 ; -1 0 1];
octave-3.2.3:2>     rank(sobel)
ans =  1
octave-3.2.3:3> 

См. Также: http://blogs.mathworks.com/steve/2006/11/28/separable-convolution-part-2/ - это охватывает использование SVD (разложение по сингулярному значению) для извлечения двух одномерных ядер из разделяемого 2Dkernel.

См. также этот вопрос на DSP.stackexchange.com : Быстрый / эффективный способ разложения разделимых целочисленных коэффициентов 2D-фильтра

4 голосов
/ 14 мая 2011

Вы также можете разбить матрицу на симметричные и наклонные части и разделить каждую часть, что может быть эффективно для больших 2-мерных сверток.

...