2011-05-04 20 views

Respuesta

17

Si el núcleo del filtro 2D tiene una rank de 1, entonces es separable. Puedes probar esto en, por ejemplo, Matlab o 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> 

Ver también: http://blogs.mathworks.com/steve/2006/11/28/separable-convolution-part-2/ - esto cubre utilizando SVD (descomposición en valores singulares) para extraer los dos núcleos de 1D de un núcleo 2D separable.

Ver también esta pregunta en DSP.stackexchange.com: Fast/efficient way to decompose separable integer 2D filter coefficients

+1

SVD es el camino a seguir aquí. Los núcleos separables (es decir, rango 1) son muy específicos, y SVD le permite aproximar su núcleo por una (pequeña) suma de los separables. –

4

También puede dividir la matriz en partes simétricas y sesgar y separada cada parte, que puede ser eficaz para circunvoluciones 2d más grandes.

+0

¿Puedes dar un ejemplo para aclarar? – mrgloom

+1

Si puede organizar su matriz 2d como el producto vectorial 'xy '+ u.v'' etc., puede hacer un conjunto de convoluciones 1d de las filas y columnas en lugar de la convolución 2d, necesitando solo 4N multiplicar/añadir en lugar de N^2. Si el 'u.v'' tiene un tamaño más pequeño, entonces la reducción es mayor. Esto usualmente asume que usted tiene conocimiento previo de la estructura de la matriz para facilitar la separación. También dependerá de su motor de cálculo: una GPU puede favorecer a otra estructura. –

Cuestiones relacionadas