/* Segmentação de regiao homogenea - algoritmo de Blob coloring  variância*/

#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;
	int aux, ai, aj , label = 0, nrnc , ac1  ,vlabel = 0;
	float   A = 0, B = 0, XY = 0, w = 0, ac2, ac3, ac4, L;
	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 ("%f", &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;

	     A = ((imagem_copia[i-1][j-3]-A)*(imagem_copia[i-1][j-3]-A) + ( imagem_copia[i-1][j-2]-A)*( imagem_copia[i-1][j-2]-A) + ( imagem_copia[i-1][j-1]-A)* ( imagem_copia[i-1][j-1]-A)  + ( imagem_copia[i][j-3]-A)*( imagem_copia[i][j-3]-A) +  (imagem_copia[i][j-2]-A)*(imagem_copia[i][j-2]-A)   + ( imagem_copia[i][j-1]-A)* ( imagem_copia[i][j-1]-A)  + ( imagem_copia[i+1][j-3]-A)* ( imagem_copia[i+1][j-3]-A)+  (imagem_copia[i+1][j-2]-A)*(imagem_copia[i+1][j-2]-A)  +  (imagem_copia[i+1][j-1] - A )*(imagem_copia[i+1][j-1] - A )  )/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;

	    B = ((imagem_copia[i-3][j]-B) * (imagem_copia[i-3][j]-B)    + ( imagem_copia[i-3][j+1]-B)*( imagem_copia[i-3][j+1]-B)   + ( imagem_copia[i-3][j+2]-B)* ( imagem_copia[i-3][j+2]-B)   +  (imagem_copia[i-2][j]-B)* (imagem_copia[i-2][j]-B)  +  (imagem_copia[i-2][j+1]-B)*(imagem_copia[i-2][j+1]-B)   + ( imagem_copia[i-2][j+2]-B)*( imagem_copia[i-2][j+2]-B)    +  (imagem_copia[i-1][j]-B)* (imagem_copia[i-1][j]-B)   + ( imagem_copia[i-1][j+1]-B)* ( imagem_copia[i-1][j+1]-B)   + ( imagem_copia[i-1][j+2]-B)* ( imagem_copia[i-1][j+2]-B) )/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;

	   XY = ((imagem_copia[i-1][j-1]-XY) *(imagem_copia[i-1][j-1]-XY)   +  (imagem_copia[i-1][j]-XY)*(imagem_copia[i-1][j]-XY)   +  (imagem_copia[i+1][j+1]-XY)* (imagem_copia[i+1][j+1]-XY)   + ( imagem_copia[i][j-1]-XY)* ( imagem_copia[i][j-1]-XY)  + ( imagem_copia[i][j]-XY) *( imagem_copia[i][j]-XY)   +  (imagem_copia[i][j+1]-XY)*(imagem_copia[i][j+1]-XY)    + ( imagem_copia[i+1][j-1]-XY) *( imagem_copia[i+1][j-1]-XY)    +  (imagem_copia[i+1][j]-XY)* (imagem_copia[i+1][j]-XY)   + ( imagem_copia[i+1][j+1]-XY)*( imagem_copia[i+1][j+1]-XY) )/9;

	  

	   // A = (int) (A * 100);
	   //B = (int) (B * 100);
	   //XY = (int) (XY * 100);
 
	   //printf(" o valor de A é %f \n",A);
	   //printf(" o valor de B é %f \n",B);
	   //printf(" o valor de XY é %f \n",XY);
	   // printf(" o valor de L é %f \n",L);
		 						     
	   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 = imagem_copia[i][j-1] ;
		  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 = imagem_copia[i-1][j];
		  label_matriz[i][j] = label; 
		  label_matriz[i-1][j] = label; 
		  if ((XY <= L) &&  (A <= L)) 
		     {
		       label_matriz[i][j-1] = label; 
		     }
		}  						     
	    } 


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


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

	  }
	}

		  
	k = 0;
	f = fopen ("blobvar_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);     
	
}