/* * Realiza a filtragem da media a partir da convolucao entre uma imagem ruidosa * com uma mascara de tamanho nxn (n, impar, eh um parametro de entrada) * * n = 3 (default) */ #define MAX #include "lib.h" #include #include IMAGE avg(IMAGE x, int n); IMAGE avg(IMAGE x, int n) { int i,j,mi,mj; IMAGE y; unsigned int av; y = newimage(x->info->nr, x->info->nc); for (i = n/2; i < x->info->nr-n/2; i++) { for (j = n/2; j < x->info->nc-n/2; j++) { av = 0; //Average calculation for (mi = i - n/2; mi <= i + n/2; mi++) { for (mj = j - n/2; mj <= j + n/2; mj++) { av += x->data[mi][mj]; } } y->data[i][j] = (unsigned char)(av / (n*n)); } } return(y); } IMAGE avg_test() { IMAGE x; //small case test x = newimage(3,3); x->data[0][0] = 200; x->data[0][1] = 150; x->data[0][2] = 200; x->data[1][0] = 150; x->data[1][1] = 200; x->data[1][2] = 150; x->data[2][0] = 200; x->data[2][1] = 150; x->data[2][2] = 100; return(avg(x, 3)); } main(int argc, char *argv[]) { int n = 3; IMAGE x=0; time_t t0, t1; if (argc < 2) { printf("Usage: avg []\n"); exit(1); } x = Input_PBM(argv[1]); if (x == 0) { printf("No input image ('%s')\n", argv[1]); exit(2); } if (argc > 2) { sscanf(argv[2], "%d", &n); if (n % 2 <= 0) { printf("Mask size must be an odd natural number\n"); exit(2); } } printf("Average filter with mask of size %d\n", n); t0 = time(NULL); x = avg(x, n); t1 = time(NULL); Output_PBM(x, "avg.pgm"); printf("Output is in file 'avg.pgm'\n"); printf("Processing time: %lf seconds\n", difftime(t1,t0)); }