/*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");
}