lunes, 12 de julio de 2010

Line Integral Convolution

Admito que últimamente nada más que posteo de los trabajos que hago en el máster, pero es que da una alegría cuando te sale algo después de tirarte un par de semanas depurando ...

Os acordáis de lo que os conté del programa que estaba haciendo para tratar las imágenes y que parecieran dibujos, sino pues aquí os dejo un enlace :P. El caso es que uno de los pasos previos era calcular la matriz ETF (Edge Tangent Flow) que básicamente es una matriz de vectores que indican la dirección en la que van los colores.

En los artículos que teníamos de referencia para implementar esto, siempre salían las imágenes que representaban el ETF en forma de imagen, y que la verdad vienen bastante bien para saber si estás calculando bien el ETF o no. Así que después de pensarlo me decidí a implementarlo, pero la cosa no era nada fácil ... El artículo en el que venía explicado el LIC, la notación matemática que usaba era chino total, no entendía nada de nada. Pero seguí buscando hasta que encontré un algoritmo que según el nombre era más rápido que el LIC tradicional, el Fast LIC.

Después de leerlo vi que todo era mucho más sencillo :P. Y la verdad nos ayudó mucho con la parte de extracción de líneas y de color :).

Os voy a dejar el pseudocódigo del algoritmo, que su trabajo me ha costado depurar.

for (i = 0; i <> for (j = 0; j <> if (numHits(i, j) <> calculo el streamline con centro en el punto (i, j); calculo Ix0; actualizo I(i, j); for (m = 1; m <> calculo Ixm; actualizo I(streamline(m)); calculo Ix-m; actualizo I(streamline(m)); } } } }

Como se calcula el streamline, por cierto el streamline es una línea que sigue el flujo de la matriz ETF de tamaño 2*(M+L-1).

Calcular Streamline:

siguiente = anterior = origen; for (i = 0; i <> siguiente = punto siguiente (ht, ETF, siguiente); añadir siguiente a la lista de puntos siguientes; anterior = punto siguiente (-ht, ETF, anterior); añadir anterior a la lista de puntos anteriores; }
punto siguiente(h, ETF, punto):

v = ETF(punto); k1 = v * h; v = ETF(punto + k1 * 0.5); k2 = v * h; v = ETF(punto + k2 * 0.5); k3 = v * h; v = ETF(punto + k3); k4 = v * h; resultado = punto + k1/6 + k2/3 + k3/3 + k4/6;

Calcular Ix0:

Ix0 = 0; for (l = -L; l <= L; l++){ if (valido(stl(l))){ Ix0 += textura(stl(l)); validos ++; } } Ix0 = Ix0 / validos;

Calcular Ixm:

k = 1 / validos; Ixm = Ixm + k * (textura(stl(m+L)) - textura(stl(m-L-1)));

Calcular Ix-m:

k = 1 / validos; Ix-m = Ix-m + k * (textura(stl(m-L)) - textura(stl(m+L+1)));

Y estas son algunas imágenes de su funcionamiento :). Si queréis verlas mejor, os aconsejo que pinchéis sobre ellas y las podáis ver más grandes :P












2 comentarios:

  1. Que gracia la imagen (ultima) la que tienes como avatar :P

    Un saludo!

    PD: gracias por enlazar a Quicoto Blog :)

    ResponderEliminar