Exemple #1
0
int main (int argc, char *argv[])
{
    long rowsA, colsA;          /* Dimensiones de la imagen A */
    long rowsB, colsB;          /* Dimensiones de la imagen B */
    unsigned char **imageA;     /* Array 2D para la imagen A */
    unsigned char **imageB;     /* Array 2D para la imagen B */
    int readOK, writeOK;        /* Controlan la E/S de disco */
    precint *precinctsIn;       /* Vector de precintos de entrada*/
    long npIn;                  /* Numero de elementos del vector de entrada */
    precint *precinctsOut;      /* Vector de precintos de salida*/
    long precinctSize;          /* Tamaño del precinto */
    long i, j, k;
    unsigned char diff;
    double sumaMSE;

    /* Comprobamos el número de parametros */
    if (argc!=6)
    {
        printf("\nUso: %s <in_filename_precincts_list_txt> <in_filenameA> <in_filenameB> <precinct_size> <out_filename_precincts_list>.",argv[0]);
        printf("\n\nin_filename_precincts_list = Lista de precintos de entrada.");
        printf("\nin_filenameA = Image PGM.");
        printf("\nin_filenameB = Image PGM.");
        printf("\nprecinct_size = [16,4096].");
        printf("\nout_filename_precincts_list = Precincts list.\n\n");
        exit(0);
    }

    /* Validamos el valor del tamaño de precinto */
    precinctSize = atoi(argv[4]);
    /*if (precinctSize<16 || precinctSize>4096 || precinctSize%2!=0)
    {
        printf("\nEl valor de precint_size debe un múltiplo de 2 entre [16,4096].\n");
        exit(0);
    }*/

    /* Reservamos memoria dinámica para la imagen */
    imageA = ( unsigned char** )malloc( MAXROWS*sizeof( unsigned char* ) );
     
    /* Reservamos memoria para cada fila */
    for(i = 0; i < MAXROWS; i++) 
    {
        imageA[i] = ( unsigned char* )malloc( MAXCOLS*sizeof( unsigned char ) );
    }

    /* Reservamos memoria dinámica para la imagen */
    imageB = ( unsigned char** )malloc( MAXROWS*sizeof( unsigned char* ) );
     
    /* Reservamos memoria para cada fila */
    for(i = 0; i < MAXROWS; i++) 
    {
        imageB[i] = ( unsigned char* )malloc( MAXCOLS*sizeof( unsigned char ) );
    }

    /* Leemos la imagen A de disco */
    readOK = pgmRead (argv[2],&rowsA,&colsA,imageA);
    if (!readOK)
    {
        printf("\nError al abrir la imagen: %s.\n",argv[2]);
        exit(1);
    }

    /* Leemos la imagen B de disco */
    readOK = pgmRead (argv[3],&rowsB,&colsB,imageB);
    if (!readOK)
    {
        printf("\nError al abrir la imagen: %s.\n",argv[3]);
        exit(1);
    }

    /* Comprobamos que las dos imágenes tienen las mismas dimensiones */
    if (rowsA==rowsB && colsA==colsB)
    {
        /* Calculamos el numero de precintos que contiene la imagen */
        npIn = (rowsA/precinctSize)*(colsA/precinctSize);

        /* Reservamos memoria dinámica para el vector de precintos */
        precinctsIn = (precint *) malloc (npIn*sizeof(precint));
        precinctsOut = (precint *) malloc (npIn*sizeof(precint));

        /* Leemos el vector de precintos sobre el que vamos a calcular las diferencias */
        readOK = readPrecinctsFromFileTXT(precinctsIn, &npIn, argv[1]);
        if (!readOK)
        {
            printf("\nError al abrir el archivo de precintos: %s.\n",argv[1]);
            exit(1);
        }

        for(i=0;i<npIn;i++) 
        {
            /* Calculamos el MSE para cada precinto */
            /* Restamos píxel a píxel los precintos de la imagen A con la imagen B */
            sumaMSE = 0;
            for(j=precinctsIn[i].offsetx;j<(precinctsIn[i].offsetx + precinctSize);j++)
            {
                for(k=precinctsIn[i].offsety;k<(precinctsIn[i].offsety + precinctSize);k++)
                {
                    diff = (unsigned char)(((int)imageA[j][k] - (int)imageB[j][k]))+128;
                    sumaMSE = sumaMSE + ((diff-128)*(diff-128));
                }
            }
            //printf("[%d] %lf. PrecintSize: %ld, MSE: %lf\n", i, sumaMSE, precinctSize, sumaMSE/(precinctSize*precinctSize));

            /* Generamos el vector de precintos con las diferencias */
            precinctsOut[i].offsetx = precinctsIn[i].offsetx;
            precinctsOut[i].offsety = precinctsIn[i].offsety;
            precinctsOut[i].countDifferences = sumaMSE/(precinctSize*precinctSize);
        }

        /* Ordenamos el vector de precintos */
        OrdenarSeleccionDirecta(precinctsOut,npIn);

        /* Imprimimos la lista de precintos */
        printPrecinctsList(precinctsOut,npIn);

        /* Guardamos la lista de precintos en disco */
        writeOK = writePrecinctsToFile(precinctsOut,npIn,argv[5]);
        if (writeOK)
        {
            printf("\nEl archivo: %s, con la lista de precintos se ha creado con éxito.",argv[5]);
        }
        else
        {
            printf("\nError al crear el archivo de precintos: %s.",argv[5]);
        }
    }
    else
    {
        printf("\nLas imágenes no tienen las mismas dimensiones.\n");
    }

    /* Liberamos la memoria usada por las imágenes */
    deallocate2D(imageA,MAXROWS);
    deallocate2D(imageB,MAXROWS);

    return 0;
}
Exemple #2
0
int main(int argc, char *argv[])
{
	offset *lista;
	offset *distintos;
	long ne, nedis;
	double sum;
	int readOK, writeOK;

	if (argc != 3)
	{
		printf("\nUso: %s <in_offset_list> <out_distinct_offset_list>\n",argv[0]);
		printf("\nDescripción: ");
		printf("\n    Acepta una lista de offsets y devuelve la misma lista sin elementos repetidos.\n");
		printf("\nParámetros: ");
		printf("\n    - <in_offset_list> = Archivo de entrada con la lista de offsets.");
		printf("\n    - <out_offset_list> = Archivo de salida con la lista de offsets.\n\n");
		exit(1);
	}

	/* Contamos el numero de elementos de la lista para reservar memoria */
	ne = NumeroDeOffsetList(argv[1]);
	if (!ne)
	{
		printf("\nError al abrir el archivo: %s.",argv[1]);
		exit(1);
	}

	/* Reservamos memoria dinámica para los vectores de offsets */
   	lista = (offset *) malloc (ne*sizeof(offset));
   	distintos = (offset *) malloc (ne*sizeof(offset));

	/* Leemos el archivo de offsets */
	readOK = LeerOffsetList(argv[1],lista,&ne);
	if (!readOK)
	{
		printf("\nError al abrir el archivo: %s.",argv[1]);
		exit(1);
	}

	//qsort(lista, ne, sizeof(offset), &compare);

	/* Creamos una lista con los paquetes que no se repiten */
	EliminarRepetidosOne(lista,ne,distintos,&nedis);
	printf("\n# Paquetes total: %ld",ne);
	printf("\n# Paquetes distintos: %ld",nedis);
	printf("\n# Paquetes repetidos: %ld",ne-nedis);

	/* Sumamos los bytes de los paquetes distintos */
	sum = SumBytes(distintos,nedis);
	printf("\nSum (Bytes): %lf",sum);
	printf("\nSum (KBytes): %lf",sum/1024);
	printf("\nSum (MBytes): %lf\n",sum/(1024*1024));
	printf("\nBYTES: %.0lf",sum);

	/* Ordenamos la lista ascendentemente según el offset */
	OrdenarSeleccionDirecta(distintos,nedis);

	/* Guardamos la nueva lista de offset sin elementos repetidos */
	writeOK = EscribirOffsetList(argv[2],distintos,nedis);
	if (!writeOK)
	{
		printf("\nError al crear el archivo: %s.",argv[2]);
		exit(1);
	}

	return 0;
}
Exemple #3
0
int main (int argc, char *argv[])
{
    precint *precinctsUp;
    precint *precinctsDown;
    precint *precinctsOut;
    long npUp;
    long npDown;
    long i, j;
    int readOK, writeOK;

    if (argc!=4)
    {
        printf("\nUso: %s <in_filename_precincts_list_A_dat> <in_filename_precincts_list_B_dat> <out_filename_precincts_dat>.\n\n",argv[0]);
        exit(0);
    }

    /* Reservamos memoria dinámica para los vectores de precintos */
    precinctsUp = (precint *) malloc (MAX*sizeof(precint));
    precinctsDown = (precint *) malloc (MAX*sizeof(precint));
    precinctsOut = (precint *) malloc (2*MAX*sizeof(precint));

    readOK = readPrecinctsToFile(precinctsUp, &npUp, argv[1]);
    if (!readOK)
    {
        printf("\nError al abrir el archivo: %s.\n",argv[1]);
        exit(1);
    }

    readOK = readPrecinctsToFile(precinctsDown, &npDown, argv[2]);
    if (!readOK)
    {
        printf("\nError al abrir el archivo: %s.\n",argv[2]);
        exit(1);
    }


    for(i=0;i<npUp;i++)
    {
        precinctsOut[i] = precinctsUp[i];
    }

    for(j=0;j<npDown;j++)
    {
        precinctsOut[i] = precinctsDown[j];
        i++;
    }

    OrdenarSeleccionDirecta(precinctsOut, i);

    writeOK = writePrecinctsToFile(precinctsOut, i, argv[3]);
    if (!writeOK)
    {
        printf("\nError al abrir el archivo: %s.\n",argv[3]);
        exit(1);
    }
    else
    {
        printf("\nEl archivo: %s se creó con éxito.\n",argv[3]);
    }

    return 0;
}