4. Implementaci´ on y resultados
4.3. Trasmisi´on de las im´agenes capturadas por IPv6
4.3.2. Cliente IPv6
Para el cliente IPv6, se gener´o un c´odigo (Ap´endice G.3.2) de la misma forma como se hizo para el servidor IPv6. Definiendo nuevas variables para el manejo de los datos recibidos:
unsigned char *imagen; char *inbuf;
long CuentaPix, CuentaRead, LenCuad; char Encab[9];
unsigned long ind; unsigned char *pimagen;
La variable*imagencontendr´a la imagen recibida, al igual que en el caso del servidor*inbuf
recibir´a los datos transmitidos, CuentaPix, CuentaReady LenCuadson variables que permi- ten contabilizar los bytes recibidos y conocer si se ha completado la recepci´on de la imagen, y por ´ultimo *pimagen permite guardar la imagen usando una subrutina de creaci´on de archivos .raw (datos en bruto).
El programa cliente reserva memoria para la imagen:
imagen = (unsigned char *)malloc(X*Y*sizeof(unsigned char));
Posteriormente crea el socket, completando la estructura sockaddr in6 y conectandose al servidor. Por medio del ciclo while(1) se reciben las im´agenes transmitidas, enviando la petici´on para recibir la cabecera:
send(mysocket6, (unsigned char *)"s\0", 2, 0);
Una vez que el servidor recibi´o la petici´on y envi´o la cabecera, el cliente debe saber hasta donde parar la recepci´on de los datos de la cabecera, coloca cero enCuentaPix y por medio de un ciclowhile() lee uno a uno los bytes que componen la cabecera:
CuentaPix=0;
while ((CuentaRead = recv(mysocket6,inbuf,8-CuentaPix,0))) { for(ind=0; ind<(CuentaRead); ind++){
Encab[CuentaPix++]=*(inbuf+ind);} if (CuentaPix == 8){
LenCuad=strtol(Encab+2,NULL,10); break;}
4.3. TRASMISI ´ON DE LAS IM ´AGENES CAPTURADAS POR IPV6
La funci´on recv() (Ap´endice C) permite leer todos los bytes que se enviaron de la ca- becera y almacenarlos en *inbuf. Se le indica al comando que trate de leer de una sola vez los 8 bytes (8−0 = 8). El ciclo for indexa uno a uno los bytes contenidos en *inbuf
guard´andose en la variableEncab[], la instrucci´onifpregunta si se leyeron los 8 bytes en el primer intento, si es afirmativo la variableLenCuadalmacena los ´ultimos 6 bytes deEncab[]
por medio de la funci´on strtol()4
. En caso contrario se regresa al ciclo while() para leer los restantes bytes (8-CuentaPix).
Cuando el cliente recibe la cabecera, env´ıa una nueva petici´on de datos al servidor:
printf("La imagen es de: %ld\n",LenCuad); send(mysocket6,(unsigned char *)"s",1,0);
El servidor recibe la petici´on y env´ıa la imagen. El cliente conoce cuantos bytes de la ima- gen debe leer (LenCuad). El proceso para recibir los bytes de la imagen es muy similar a la recepci´on de la cabecera:
CuentaPix=0;
while ((CuentaRead = recv(mysocket6,inbuf,LenCuad-CuentaPix,0))) { for(ind=0; ind<(CuentaRead); ind++){
*(imagen+(CuentaPix++))=*(inbuf+ind); if (CuentaPix == LenCuad){ break; } } if (CuentaPix == LenCuad) { break; } }
Por ´ultimo la imagen recibida se guarda en formato raw mediante la funci´oncreate_raw():
pimagen=(unsigned char *)imagen; create_raw(pimagen, i);
i=i++;
el apuntador pimagen hace una llamada a create_raw(), el ´ındice i permite guardar cada imagen con un nombre diferente (Ap´endice G.1.6).
4
La funci´onstrtol()convierte una cadena de entrada (nptr) en un valor entero del tipolong de acuerdo a una base dada (base), tiene la siguiente sintaxis:long int strtol(const char *nptr, char **endptr, int base).
4.4.
Transformada de Hermite
La transformada de Hermite se emplea en la codificaci´on de las im´agenes para enviar los coeficientes m´as relevantes a trav´es de la red.
El algoritmo usado para calcular la transformada de Hermite se basa en el trabajo realizado por Sep´ulveda A.[36], es un algoritmo r´apido para la implementaci´on de la transformada de Hermite discreta. El algoritmo fue propuesto por M. Hashimoto y J. Sklansky en 1985[37] y consiste en la estimaci´on de las derivadas de la funci´on Gaussiana mediante convoluciones repetidas por dos secuencias [1,1] y [1,−1] en las direcciones X y Y.
El proceso de codificaci´on de im´agenes por la transformada de Hermite (Ap´endice G.4), consiste en calcular la transformada de Hermite discreta directa (Secci´on 2.7) de una ima- gen, realizar la proyecci´on de 2D a 1D (Secci´on 2.4) de los coeficientes de primer y segundo orden, estimar dichos coefientes realizando la proyecci´on de 1D a 2D y por ´ultimo calcular la transformada de Hermite discreta inversa para recuperar la imagen.
Los nueve coeficientes de la transformada (hasta 4o orden) se guardan en las variables mos-
tradas en la Tabla 4.2. La imagen de entrada y la imagen reconstru´ıda se guardan en imag
Tabla 4.2: Variables usadas para los coeficientes de la transformada de Hermite
Coeficiente Variable usada
F00 *K00 F01 *Co2 F02 *Co3 F10 *Co4 F11 *Co5 F12 *Co6 F20 *Co7 F21 *Co8 F22 *Co9
eimag2respectivamente, reservando memoria de acuerdo al tama˜no de la imagen de original:
long TamIma=ANCHO*ALTO,TamTrans; TamTrans=(ANCHO/2+1)*(ALTO/2+1);
imag = (unsigned char *)malloc(TamIma*sizeof(char)); imag2= (unsigned char *)malloc(TamIma*sizeof(char));
La funci´onmalloc()asignaTamIma*sizeof(char) bytes y devuelve un puntero a la memo- ria asignada. De igual manera se reserva memoria para los coeficientes hasta cuarto orden
4.4. TRANSFORMADA DE HERMITE
de la transformada, por ejemplo para reservar memoria para el coeficiente F01:
Co2= (signed short int *)malloc(TamTrans*sizeof(int));
con la diferencia de que los coeficientes ocupan una cuarta parte del tama˜no original de la imagen, debido al proceso de submuestreo conT = 2 (Secci´on 2.1).
Se tienen tres variables Kord0, Kord1 y Kord2 que almacenan los valores de los coeficientes de primer y segundo orden respectivamente en la direcci´on (´angulo) definida por Kord2, us´andose en la proyecci´on de 2D a 1D. Estas variables son del mismo tama˜no que los coefi- cientes de la transformada.
El programa genera la funci´on de ´angulos hn,θ(l, k −l) ( ecuaci´on (2.51) ) usando ocho
valores (#define NUM_ANG 8) para el ´anguloθ, los cuales son equidistantes entre s´ı y com- prendidos en el rango [0,2π]. Esto se realiza por medio de la rutina ecuaciones() y los valores son guardados en las variables:
q_1_0[NUM_ANG+1] q_0_1[NUM_ANG+1] q_2_0[NUM_ANG+1] q_1_1[NUM_ANG+1] q_0_2[NUM_ANG+1]
Una vez definidas las funciones de ´angulos, se calcula la transformada discreta de Hermite, obteni´endose nueve coeficientes:
trans_9c_sd(imag,K00,Co2,Co3,Co4,Co5,Co6,Co7,Co8,Co9,ALTO,ANCHO);
Con los coeficientes calculados se realiza la proyecci´on de 2D a 1D ( ecuaci´on (2.26) ), usando la rutinaProy_2D_1D():
Proy_2D_1D(Co2,Co3,Co4,Co5,Co6,Kord0,Kord1,Kord2,ALTO,ANCHO);
En esta funci´on la variable de salida ta guarda el ´angulo de la direcci´on con la mayor energ´ıa, cuyo valor se obtiene aplicando la ecuaci´on (2.33) para todos los coeficientes en los ocho ´angulos posibles. Las variables t1 y t2 almacenan los valores de los coeficientes de primer y segundo orden en la direcci´on definida por ta. Esta funci´on s´olo toma en cuenta los coeficientesF10,F01,F11,F20 yF02 para generar dos coeficientes de salida, donde F10y
F01 permitir´an calcular el coeficiente de primer orden (t1) y, con F20, F02 y F11 se calcula el coeficiente de segundo orden (t2), ambos en la direcci´on definida porta.
Para reconstruir la imagen, se realiz´o la proyecci´on de 1D a 2D ( ecuaci´on (2.34) ) para obtener los cinco coeficientes Co2,Co3, Co4, Co5 y Co6 en base a los dos coeficientes Kord0,
Kord1 y la variable de ´angulos Kord2:
Proy_1D_2D(Co2,Co3,Co4,Co5,Co6,Kord0,Kord1,Kord2,ALTO,ANCHO);
La funci´onProy_1D_2D cuenta con las siguientes variables:
Los arreglos de entrada kk1t, kk2t y kkth que contienen los valores de los coeficien- tes de primer y segundo orden, y los ´angulos de la direcci´on con la mayor energ´ıa respectivamente.
La funci´on de ´anguloshn,θ(l, k−l), representada por las variables q_1_0[NUM_ANG+1],
q_0_1[NUM_ANG+1], q_2_0[NUM_ANG+1], q_1_1[NUM_ANG+1] y q_0_2[NUM_ANG+1].
Las variables de salida t01, t10, t02, t11 y t20, en las que se almacenan los valores de los coeficientes proyectados en dos dimensiones.
La transformada de Hermite discreta inversa se realiza por medio de la funci´on:
atrans_9c_sd(imag2,K00,Co2,Co3,Co4,Co5,Co6,Co7,Co8,Co9,ALTO,ANCHO);
Los filtros patr´on (Secci´on 2.1) son similares a los filtros de transformaci´on, los cuales reali- zan una s´ıntesis de las matrices de coeficientes de la transformada de Hermite para generar una sola matriz que representa a la imagen recuperada.