Derek
Derek

Reputation: 11915

How can I determine if my convolution is separable?

What makes a convolution kernel separable? How would I be able to tell what those separable parts were in order to do two 1D convolutions instead of a 2D convolution>

Thanks

Upvotes: 22

Views: 11984

Answers (2)

Paul R
Paul R

Reputation: 212979

If the 2D filter kernel has a rank of 1 then it is separable. You can test this in e.g. Matlab or 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> 

See also: http://blogs.mathworks.com/steve/2006/11/28/separable-convolution-part-2/ - this covers using SVD (Singular Value Decomposition) to extract the two 1D kernels from a separable 2D kernel.

See also this question on DSP.stackexchange.com: Fast/efficient way to decompose separable integer 2D filter coefficients

Upvotes: 20

Philip Oakley
Philip Oakley

Reputation: 14071

you can also split the matrix into symmetric and skew parts and separate each part, which can be effective for larger 2d convolutions.

Upvotes: 4

Related Questions