#include <Magick++.h>
#include <iostream.h>
#include <fstream.h>
#include <math.h>


using namespace std;
using namespace Magick;

double pixels[1024][1024];
bool traversed[1024][1024];
int cols,rows;
int seedx,seedy;
double th;
double intes;

void writeimage(char* filename,int r,int c,int ask=0)
{

  char buffer[80];
  if(ask)
    {

      char choice;
      cout << "\nWant to save the image(y/n)  : ";
      cin >> choice;
      if(choice!='y' && choice!='Y')
	return;

      cout << "Enter filename : " ;
      cin >> buffer;
    }

  
      
  Image fspectrum(Geometry(c,r),"white");
  fspectrum.classType(DirectClass);
  fspectrum.quantizeColorSpace(GRAYColorspace);
  Pixels fview(fspectrum);
  PixelPacket *fpixels = fview.get(0,0,c,r);

  for(int x=0;x<r;x++)
    for(int y=0;y<c;y++)


      {
	(*fpixels) = ColorGray(pixels[x][y]);
	fpixels++;
      }
    
  fview.sync();
  fspectrum.write((ask==1) ? buffer : filename);

}


void displayimage(int r,int c)
{
  Image fspectrum(Geometry(c,r),"white");
  fspectrum.classType(DirectClass);
  fspectrum.quantizeColorSpace(GRAYColorspace);
  Pixels fview(fspectrum);
  PixelPacket *fpixels = fview.get(0,0,c,r);

  for(int x=0;x<r;x++)
    for(int y=0;y<c;y++)
      {
	(*fpixels) = ColorGray(pixels[x][y]);
	fpixels++;
      }
    
  fview.sync();
  fspectrum.display();


}

void grow(int sx,int sy)
{

  traversed[sx][sy]=true;

  //  if((!traversed[sx-1][sy-1]) && fabs(pixels[sx-1][sy-1]-pixels[sx][sy]) <= th)
  //   grow(sx-1,sy-1);

  if((!traversed[sx][sy-1]) && fabs(pixels[sx][sy-1]-intes) <= th)
    grow(sx,sy-1);

  //  if((!traversed[sx+1][sy-1]) && fabs(pixels[sx+1][sy-1]-pixels[sx][sy]) <= th)
  // grow(sx+1,sy-1);

  if((!traversed[sx+1][sy]) && fabs(pixels[sx+1][sy]-intes) <= th)
    grow(sx+1,sy);

  //if((!traversed[sx+1][sy+1]) && fabs(pixels[sx+1][sy+1]-pixels[sx][sy]) <= th)
  //  grow(sx+1,sy+1);

  if((!traversed[sx][sy+1]) && fabs(pixels[sx][sy+1]-intes) <= th)
    grow(sx,sy+1);

  //if((!traversed[sx-1][sy+1]) && fabs(pixels[sx-1][sy+1]-pixels[sx][sy]) <= th)
  //  grow(sx-1,sy+1);

  if((!traversed[sx-1][sy]) && fabs(pixels[sx-1][sy]-intes) <= th)
    grow(sx-1,sy);
  
}

void main()
{

  Image source;
  int cols,rows;
  char startfile[80];
  

  cout << "Enter input file name : " << flush;
  cin >> startfile;

  cout << "Enter seedx , seedy : " << flush;
  cin >> seedx >> seedy;


  cout << "Enter Threshold : " << flush;
  cin >> th;
  
  source = Image(startfile);
  cols = source.baseColumns();  
  rows = source.baseRows();
  source.classType(DirectClass);
  source.quantizeColorSpace(GRAYColorspace);

   Pixels viewsrc(source);
  PixelPacket *pixelsrc = viewsrc.get(0,0,cols,rows);

   
  for(int x=0;x<rows;x++)
    for(int y=0;y<cols;y++)
      {
	pixels[x][y] = ((ColorGray)(*pixelsrc)).shade();	
	pixelsrc++;
      }
  pixelsrc-= cols*rows;

  //cout << "Initial Image : " << flush;
  //displayimage(rows,cols);
  


  //___got the image now play with it

  int i,j;
  
  for(i=0;i<rows;i++)
    for(j=0;j<cols;j++)
      traversed[i][j]=false;

  cout << "growing now..." << flush;

  intes=pixels[seedy][seedx];
  
  grow(seedy,seedx);

  cout << "growing finished..." << flush;
  
 
  for(i=0;i<rows;i++)
    for(j=0;j<cols;j++)
      if(traversed[i][j])
	pixels[i][j]=0;
  //__region growing done
  

  cout << "Final image : " << flush;
  displayimage(rows,cols);
  

  writeimage("",rows,cols,1);
  
}

