feConvolveMatrix

facebook-svg gplus-svg twitter-svg

El filtro <feConvolveMatrix> permite recalcular el valor de cada pixel de una imagen en función del valor de los pixeles adyacentes, permitiendo crear efectos de tipo desenfoque ( blur ), nitidez ( sharpening ) grabado ( embossing ) o biselado ( beveling ).

La sintaxis

Este es un ejemplo muy sencillo. El atributo order ( magnitud ) tiene en este caso el valor 3, lo que quiere decir que la matriz de circunvolución ( kernelMatrix ) aplicada tiene 3 * 3 = 9 valores. Hay más atributos que podemos utilizar pero por ahora nos quedamos solo con estos dos.

<filter id="f0">
       <feConvolveMatrix 
            order="3"
            kernelMatrix="0 0 0 
                          0 1 0 
                          0 0 0" />
</filter>

Como funciona

Sabemos que cada pixel tiene 4 canales de color; rojo (R), verde (G), azul (B) y transparencia o alfa (A). Ahora imagínense una imagen de 5px / 5px cuyos valores para uno de los canales de color ( por ejemplo rojo ) son las siguientes:

        0  20  40 235 235
      100 120 140 235 235
      200 220 240 235 235
      225 225 255 255 255
      225 225 255 255 255

Y el valor de la matriz de circunvolución ( kernelMatrix ) es:

kernelMatrix="1 2 3 
              4 5 6 
              7 8 9"

En este caso el valor modificado del pixel cuyo valor inicial es 120 será:

    (9* 0 + 8* 20 + 7* 40 +
    6*100 + 5*120 + 4*140 +
    3*200 + 2*220 + 1*240) / (9+8+7+6+5+4+3+2+1) = 77.33

Algunos ejemplos

1. La siguiente matriz de circunvolución deja la imagen sin modificar, ya que los pixeles adyacentes no tienen efecto alguno ( 0 ).

kernelMatrix=" 0 0 0 
               0 1 0 
               0 0 0"

2. Esta matriz de circunvolución exagera todos los pixeles que difieren mucho de los adyacentes ya que multiplicamos el valor de estos pixeles por -1.

kernelMatrix=" -1  -1  -1
               -1   7  -1
               -1  -1  -1"

3. Esta matriz de circunvolución exagera solo los pixeles situados a la derecha y a la izquierda.

kernelMatrix=" -1 2 -1 
               -1 1 -1 
               -1 2 -1"

4. Mientras que esta otra exagera solo los pixeles situados arriba y abajo:

kernelMatrix= "-1 -1 -1 
                2  1  2 
               -1 -1 -1"

5. Todos estos ejemplos utilizan una magnitud order = "3". Podemos utilizar magnitudes superiores, aunque es poco recomendable ya que  generan una sobrecarga de la CPU. Veamos un ejemplo:

order="5"
kernelMatrix="1  1      1    1  1
              1 -2     -2   -2  1
              1 -2   0.01   -2  1
              1 -2     -2   -2  1
              1  1      1    1  1"

Vea todos estos ejemplos en codepen:

See the Pen feConvolveMatrix by Gabi (@enxaneta) on CodePen.