

#include <Magick++.h>
#include <math.h>
#include <stdlib.h>
#include <fstream.h>
#include <complex.h>
#include <sys/time.h>
#include <unistd.h>



using namespace std;
using namespace Magick;

const long MAXPANELS=200000;
const int nsforms=8;
const double _gamma=0.75;


char file1[80],file2[80];
double image[1024][1024];
double image1[1024][1024];
int rows,cols,rows1,cols1;



void readimage1(char* filename)
{

  cout << "\nreadimage : " << filename << flush;
  Image source;
  
  source = Image(filename);
  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++)
      {
	image[x][y] = ((ColorGray)(*pixelsrc)).shade();	
	pixelsrc++;
      }
  pixelsrc-= cols*rows;
  
}

void readimage2(char* filename)
{

  cout << "\nreadimage : " << filename << flush;
  Image source;
  
  source = Image(filename);
  cols1 = source.baseColumns();  
  rows1 = source.baseRows();
  source.classType(DirectClass);
  source.quantizeColorSpace(GRAYColorspace);

  Pixels viewsrc(source);
  PixelPacket *pixelsrc = viewsrc.get(0,0,cols1,rows1);
  
  for(int x=0;x<rows1;x++)
    for(int y=0;y<cols1;y++)
      {
	image1[x][y] = ((ColorGray)(*pixelsrc)).shade();	
	pixelsrc++;
      }
  pixelsrc-= cols1*rows1;
  
}

double rmserror()
{

  int i,j;
  double error=0;
  for(i=0;i<rows;i++)
    for(j=0;j<cols;j++)
      {
	error+=abs(image1[i][j]-image[i][j]);
	//cout<<error<<" ";
      }
  cout<<"\n\n";
  return error*256/(rows*cols);
  

}

void main()
{

  cout << "\nEnter the file names  : " << flush ;
  cin >> file1  >> file2;

  readimage1(file1);
  readimage2(file2);

  if(rows!=rows1  || cols!=cols1)
    {
      cout << "\nImages don't match in size.";
      exit(0);
    }
  
  cout << endl << "RMS error : " << rmserror() << flush;
  
}



