Vous êtes sur la page 1sur 8

Ejemplo de convolucin 2D

Aqu est un ejemplo simple de la convolucin de la seal de entrada 3x3 y la


respuesta de impulso (kernel) en 2D espacial. La definicin de convolucin 2D y el
mtodo de convolucin en 2D se explican aqu .

En general, el tamao de la seal de salida es cada vez mayor que la seal de


entrada, pero calculamos slo la misma rea que la entrada se ha definido. Debido
a que forzamos a rellenar ceros donde las entradas no estn definidas, como x [-1,
-1] , los resultados alrededor del borde no pueden ser precisos. Adems, el
tamao de la salida se fija igual que el tamao de entrada en la mayora de
procesamiento de imgenes.

Entrada

Ncleo

Salida
Observe que el origen de la respuesta al impulso siempre est
centrado. ( H [0,0] se encuentra en la muestra central del ncleo, no el primer
elemento.)
Comencemos a calcular cada muestra de la salida una por una.
En primer lugar, voltear el ncleo, que es la caja sombreada, tanto en direccin
horizontal como vertical. Luego, muvalo sobre la matriz de entrada. Si el ncleo
est centrado (alineado) exactamente en la muestra que nos interesa, multiplique
los datos del ncleo por los datos de entrada superpuestos.
La acumulacin (sumando estas 9 multiplicaciones) es la ltima cosa que se debe
hacer para averiguar el valor de salida.

Tenga en cuenta que las matrices se hacen referencia aqu como [columna, fila],
no [fila, columna]. M es la direccin horizontal (columna) y N es la direccin
vertical (fila).
Por cierto, el kernel en este ejemplo se llama filtro Sobel , que se utiliza para
detectar las lneas de borde horizontal en una imagen. Ver ms detalles en
los filtros de ventana .

Convolucin separable 2D
En la convolucin 2D con el ncleo M N, se requieren multiplicaciones M N
para cada muestra. Por ejemplo, si el tamao del kernel es 3x3, entonces, 9
multiplicaciones y acumulaciones son necesarias para cada muestra. Por lo tanto,
la convolucin 2D es muy cara para realizar operaciones de multiplicacin y
acumulacin.

Sin embargo, si el ncleo es separable, entonces el clculo puede reducirse a M +


N multiplicaciones.

Una matriz es separable si se puede descomponer en matrices (M 1) y (1 N).


Por ejemplo;

Y, convolucin con este ncleo separable es equivalente a;

(Prueba de Convolucin Separable 2D)

Como resultado, para reducir el clculo, realizamos convolucin 1D dos veces en


lugar de convolucin 2D; Convolucione con la entrada y el ncleo M 1 en
direccin vertical, convolucione de nuevo la direccin horizontal con el resultado
de la convolucin anterior y el ncleo 1 N. La primera convolucin vertical 1D
requiere M veces de multiplicaciones y la convolucin horizontal necesita N veces
de multiplicaciones, en conjunto, M + N productos.

Sin embargo, la convolucin 2D separable requiere almacenamiento adicional


(buffer) para mantener clculos intermedios. Es decir, si hace la convolucin
vertical 1D en primer lugar, debe conservar los resultados en un buffer temporal
para poder utilizarlos posteriormente para la convolucin horizontal.

Obsrvese que la convolucin es asociativa; El resultado es el mismo, incluso si el


orden de convolucin se cambia. Asi que, Usted puede convolver la direccin
horizontal primero entonces la direccin vertical ms adelante.

El filtro de alisado gaussiano es una matriz separable bien conocida. Por ejemplo,
el filtro Gaussiano 3x3 es;

Ncleo Gaussiano 3x3

Algoritmo C ++ para la convolucin 2D


Necesitamos 4 bucles anidados para convolucin 2D en lugar de 2 bucles en
convolucin 1D.

// encuentra la posicin central del kernel (la mitad del tamao del
ncleo)
KCenterX = kCols / 2;
KCenterY = kRows / 2;

Para (i = 0; i <filas; ++ i) // filas


{
Para (j = 0; j <cols; ++ j) // columnas
{
Para (m = 0; m <kRows; ++ m) // filas del kernel
{
Mm = kRows - 1 - m; // ndice de filas de kernel
invertido

Para (n = 0; n <kCols; ++ n) // columnas del ncleo


{
Nn = kCols - 1 - n; // ndice de columna del ncleo
invertido

// ndice de la seal de entrada, utilizado para


comprobar los lmites
Ii = i + (m - kCentroY);
Jj = j + (n - kCenterX);

// ignoran las muestras de entrada que estn fuera de


lmite
If (ii> = 0 && ii <rows && jj> = 0 && jj <cols)
Out [i] [j] + = en [ii] [jj] * kernel [mm] [nn];
}
}
}
}
El cdigo de fragmento anterior es la forma ms simple y sencilla de entender
cmo funciona la convolucin en 2D. Pero puede ser la implementacin ms lenta.

Echa un vistazo a un ejemplo real; Convolucin con imagen 256x256 y filtro


Gaussiano 5x5.

La imagen de origen es una imagen de escala de grises cruda sin comprimir de 8


bits (sin signo). Y nuevamente, el ncleo gaussiano es separable;

Ncleo Gaussiano 5x5


En mi sistema (AMD 64 3200 + 2 GHz), la convolucin normal tom unos 10,3 ms
y la convolucin separable tard slo 3,2 ms. Puede ver cunta convolucin
separable es ms rpida comparada con la convolucin normal.

Descargue la aplicacin de convolucin 2D y el cdigo fuente aqu: conv2d.zip


El programa utiliza OpenGL para procesar imgenes en la pantalla.

Vous aimerez peut-être aussi