Determine whether filter coefficients are separable
S = isfilterseparable(H)
[S, HCOL, HROW] = isfilterseparable(H)
[S, HCOL, HROW] = isfilterseparable(H) uses the filter kernel, H, to return its vertical coefficients HCOL and horizontal coefficients HROW when the filter is separable. Otherwise, HCOL and HROW are empty.
HCOL is the same data type as input H when H is either single or double floating point. Otherwise, HCOL becomes double floating point. If S is true, HCOL is a vector of vertical filter coefficients. Otherwise, HCOL is empty.
HROW is the same data type as input H when H is either single or double floating point. Otherwise, HROW becomes double floating point. If S is true, HROW is a vector of horizontal filter coefficients. Otherwise, HROW is empty.
Logical variable that is set to true, when the filter is separable, and false, when it is not.
Determine if the Gaussian filter created using the fspecial function is separable.
% Create a gaussian filter two_dimensional_filter = fspecial('gauss'); % Test with isfilterseparable [isseparable, hcol, hrow] = ... isfilterseparable(two_dimensional_filter)
When you run this example, notice that hcol*hrow equals the two_dimensional_filter. This result is expected for a Gaussian filter.
Separable two-dimensional filters reflect the outer product of two vectors. Separable filters help reduce the number of calculations required.
A two-dimensional convolution calculation requires a number of multiplications equal to the width height for each output pixel. The general case equation for a two-dimensional convolution is:
If the filter H is separable then,
Shifting the filter instead of the image, the two-dimensional equation becomes:
This calculation requires only (width + height) number of multiplications for each pixel.
The isfilterseparable function uses the singular value decomposition svd function to determine the rank of the matrix.