/*Realiza filtragem da mediana usando uma matriz NxN */ #define MAX #include "lib.h" #include <math.h> int VetorOrdenado[1000]; int totpos; void printvetor(){ int i; for (i=0;i<totpos;i++){ printf(" %d",VetorOrdenado[i]); } printf("\n"); } void insertdata(int p){ int test; int tmp; VetorOrdenado[totpos]=p; test=totpos; totpos++; while ((test>0)&&(VetorOrdenado[test]<VetorOrdenado[test-1])) { tmp=VetorOrdenado[test]; VetorOrdenado[test]=VetorOrdenado[test-1]; VetorOrdenado[test-1]=tmp; test--; } } int valmediana(){ return VetorOrdenado[totpos/2]; } IMAGE mediana(IMAGE x,int n) { int i,j,d,k,m ; IMAGE newImage; d=n/2; newImage=newimage(x->info->nr,x->info->nc); for (i= 0; i< n; i++) for (j= 0; j < x->info->nc; j++) { newImage->data[i][j] = x->data[i][j]; newImage->data[x->info->nr-1-i][j] = x->data[x->info->nr-1-i][j]; } for (i= 0; i < x->info->nr; i++) for (j= 0; j < n; j++) { newImage->data[i][j] = x->data[i][j]; newImage->data[i][x->info->nc-1-j] = x->data[i][x->info->nc-1-j]; } for (i= 0; i< newImage->info->nr-1-n; i++) for (j= 0; j < newImage->info->nc-1-n; j++){ m=0; totpos=0; for (k=0;k<n*n;k++){ insertdata( x->data[i+(k/n)][j+(k % n)]); } newImage->data[i+d][j+d] = valmediana(); /* printvetor(); */ } return newImage; } main (int argc, char *argv[]) { IMAGE x=0; IMAGE medImage=0; int n; if (argc < 3) { printf ("Modo de usar: \n mediana <image> <n> \n"); exit (1); } sscanf (argv[2], "%d", &n); if ((n/2)*2 == n) { printf(" o parametro <n> deve ser um numero impar!\n"); exit(2); } x = Input_PBM (argv[1]); if (x == 0) { printf ("Arquivo Invalido: ('%s')\n", argv[1]); exit (2); } printf("Calculando a media usando uma matriz %dx%d\n",n,n); medImage=mediana(x,n); Output_PBM (medImage, "mediana.pgm"); printf ("Imagem de saida gravada no arquivo: 'mediana.pgm'\n"); }