miércoles, 5 de diciembre de 2007

Aplicando filtro Equalize (¿mejorando?)

El filtro realiza una mejora sustancial de la imagen capturada bajo circunstancias pobres de luz ó exponiendo a la víctima de Rabotron a una luz que no sea blanca, mientras que si realizamos en filtro en campo abierto no es tanta la ganancia que podamos llegar a tener comparada con la pérdida de tiempo que tenemos al aplicar la función anterior. El tiempo dirá si realmente merece la pena que realizamos el filtro, para empezar lo que hemos hecho es optimizar un poco el código para que la función tarde menos en ejecutarse, el código actual tarda un tiempo (calculado mediante pruebas) aproximado del 30% al 40% menor al código inicial de la función equalize.

El código en java del filtro de ecualizado optimizado es el siguiente:
public int [] filtroEqualizeTOR()
{
double max=255;
double[] binR= new double [tamano/3];
double[] binG= new double [tamano/3];
double[] binB= new double [tamano/3];
int [] binAux = new int [tamano];

double maxiR=0,maxiG=0,maxiB=0;
double miniR=255,miniG=255,miniB=255;
int aux=1;

//sacamos valor del pixel minimo y maximo para cada componente RGB
for (int k = 0; k < tamano/3; k++) { aux= k*3; binR[k] = imageRGB[aux]; binG[k+1] = imageRGB[aux+1]; binB[k+2] = imageRGB[aux+2]; } Arrays.sort(binR); Arrays.sort(binG); Arrays.sort(binB); maxiR=binR[(tamano/3)-1]; maxiG=binG[(tamano/3)-1]; maxiB=binB[(tamano/3)-1]; miniR=binR[0]; miniG=binG[0]; miniB=binB[0]; for (int k = 0; k < tamano/3; k++) { aux=k*3; binAux[aux]=(int)(((imageRGB[aux]-miniR)/(maxiR-miniR))* (double)max); binAux[aux+1]=(int)(((imageRGB[aux+1]-miniG)/(maxiG-miniG))*(double)max); binAux[aux+2]=(int)(((imageRGB[aux+2]-miniB)/(maxiB-miniB))*(double)max); } return binAux; }

Al estar trabajando con imágenes de 320x240 no es excesivo el tiempo ganado, pero todo lo que podamos recortar es tiempo que ganamos a la hora de ejecutar la orden a Rabotron para que se mueva. Para la demostración de este filtro voy a poner solamente un par imágenes de la ejecucion: En la parte superior de la ventana se ve la imagen captura sin aplicarle ningún tipo de filtro Mientras que en el canvas de abajo de la ventana se ve la misma imagen pero aplicándole el filtro de ecualización. En esta primera imagen podemos ver como al mejorar filtrar la imagen también mejoramos el binarizado de la misma al buscar a nuestra víctima, en este caso el color a buscar es el de la mano.

- Imagen 1-

En la segunda imagen ( Imagen 2 ) simplemente se ve la mejora realizada sobre el color de la imagen (Arriba sin aplicar filtro, Abajo tras aplicar el filtro), no mostramos el binariza:


-Imagen 2-