/* Segmentação de regiao homogenea - algoritmo de Blob coloring */
//  aqui estamos pegando os valores de pixel que tem media 3 x 3  abaixo de um limiar
//


#include <stdio.h>
#include <math.h>
#define MAX
#include "lib.h"



void ajeita(int i,int j,int lold,int m[1024][1024])
{
  
  if (m[i][j-1] == lold)
    {
      m[i][j-1] = m[i][j];
      ajeita(i, j-1, lold, m);
    }
  if (m[i-1][j] == lold)
    {
      m[i-1][j] = m[i][j];
      ajeita(i-1, j, lold, m);
    }
  if (m[i][j+1] == lold)
    {
      m[i][j+1] = m[i][j];
      ajeita(i, j+1, lold, m);
    }
  if (m[i+1][j] == lold)
    {
      m[i+1][j] = m[i][j];
      ajeita(i+1, j, lold, m);
    }      
  
}


 int main (int argc, char *argv[])
{
	int i=0, j=0, k=0, xmin=0, xmax=0, kk=0 ,b =0 ,a = 0,  ax=0, h=0, p=0, r=0, z=0, old=-1, L;
	int aux, ai, aj , label = 0, nrnc , ac1  ,vlabel = 0;
	float   A = 0, B = 0, XY = 0, w = 0, ac2, ac3, ac4;
	FILE *f;
	IMAGE im;
	int imagem_copia[1024][1024],  imagem_final[1024][1024], label_matriz[1024][1024];
	
	
	if (argc < 2)
	{
	  printf ("A imagem não estã disponível <imagem> \n");
	  exit (1);
	}

	im = Input_PBM (argv[1]);

	if (im == 0)
	{
	  printf ("No input image ('%s') \n", argv[1]);
	  exit (2);
	}
	// entrada do parametro de criterio

	printf ("entre com o valor do limiar \n");
	scanf ("%d", &L);



//copia da imagem original para as outras utilizadas
 
	for (i=1; i <  im->info->nr - 1 ; i++)
	{
	  for (j=1; j < im->info->nc - 1 ; j++)
	  {
	   imagem_copia[i][j] = im->data[i][j];
	   imagem_final[i][j] = 255;
	   label_matriz[i][j] = 0;
	  }
	}

 	    
	for (i = 3; i< im->info->nr-2; i++)
	{
	  for (j = 3; j< im->info->nc-2; j++)
	  {
	
	    A = (imagem_copia[i-1][j-3] +  imagem_copia[i-1][j-2] +  imagem_copia[i-1][j-1] +  imagem_copia[i][j-3] +  imagem_copia[i][j-2] +  imagem_copia[i][j-1] +  imagem_copia[i+1][j-3] +  imagem_copia[i+1][j-2] +  imagem_copia[i+1][j-1])/9;
	    B = (imagem_copia[i-3][j] +  imagem_copia[i-3][j+1] +  imagem_copia[i-3][j+2] +  imagem_copia[i-2][j] +  imagem_copia[i-2][j+1] +  imagem_copia[i-2][j+2] +  imagem_copia[i-1][j] +  imagem_copia[i-1][j+1] +  imagem_copia[i-1][j+2])/9;
	   XY = (imagem_copia[i-1][j-1] +  imagem_copia[i-1][j] +  imagem_copia[i+1][j+1] +  imagem_copia[i][j-1] +  imagem_copia[i][j] +  imagem_copia[i][j+1] +  imagem_copia[i+1][j-1] +  imagem_copia[i+1][j] +  imagem_copia[i+1][j+1])/9;

	   // printf(" o valor de A é %f \n",A);
	   // printf(" o valor de B é %f \n",B);
	   // printf(" o valor de XY é %f \n",XY);
	
		 						     
	   if ((XY <= L) && (A <= L))   
	      {                                          
	      if (label_matriz[i][j-1] != 0)
		{
		  label_matriz[i][j] = label_matriz[i][j-1];
                  if ((XY <= L) && (B <= L))       
		    {
		      if ((label_matriz[i-1][j] != 0) && (label_matriz[i-1][j] != label_matriz[i][j]))
			{ 
			  old = label_matriz[i-1][j];  
			  label_matriz[i-1][j] = label_matriz[i][j];

			  ajeita(i-1, j, old, label_matriz);   //Acertando os anteriores
			}
		    }
 
		}
	      
 	      else
		{
		  label = A ;
		  label_matriz[i][j] = label;    
		  label_matriz[i][j-1] = label;   
    	          if ((XY <= L) && (B <= L))      
		    { 
		      label_matriz[i-1][j] = label; 
		    }
		      
		} 						     
	    } 

	       
	   else if ((XY <= L) && (B <= L))      
	    {
	      if (label_matriz[i-1][j] != 0)
		{
		  label_matriz[i][j] = label_matriz[i-1][j];
		}
 	      else
		{
		  label = B;
		  label_matriz[i][j] = label; 
		  label_matriz[i-1][j] = label; 
		  if ((XY <= L) &&  (A <= L)) 
		     {
		       label_matriz[i][j-1] = label; 
		     }
		}  						     
	    } 


	    else {
	           label = XY;
	           label_matriz[i][j]= label;
	         }


	    // printf(" o valor de label_matriz é %d \n",label_matriz[i][j]);

	  }
	}





		  
	k = 0;
	f = fopen ("blob_res.pgm", "w");


	fprintf (f, "P2\n%d %d\n255\n", im->info->nc, im->info->nr);
	for (i=0; i<im->info->nr; i++)
	  for (j=0; j<im->info->nc; j++)
	  {
	    //	    kk =  imagem_final[i][j];
	    //	    if (kk < 0) kk = 0;
	    //	    else if (kk > 255) kk = 255;
	    

	    fprintf (f, "%3d ", label_matriz[i][j]); 
	   	    k++;
	    if (k > im->info->nc)
	    {
	      k = 0;
	      fprintf (f, "\n"); 
	    }
	  }
	fprintf (f, "\n");
	fclose (f);     
	
}