/*
 * w4735 assignment 3 step 1
 * by anders pearson <anders@columbia.edu>
 * 2001-04-19
 */


#include "defHelp.h"

#define B 6
#define N 2<<(B-1)
#define R 1

main(int argc, char *args[]){

  struct image imgGS;
  struct imageColor img, img_n; 
  int i, j, k;
  int w = 0;
  int h = 0;


  int hists[9][N][N][N];

  float norms[9][9];
  float min = 100.0;
  int mini,minj;

  int t;
  int x,y;
  int r,g,b;
  int dr,dg,db;

  char *images[9] = {"iris1.ppm","iris2.ppm","iris3.ppm","iris4.ppm",
		    "iris5.ppm","iris6.ppm","iris7.ppm","iris8.ppm",
		    "iris9.ppm"};
  char norm_image[64];
  
  /* initialize arrays */
  for(i = 0; i < 9; i++) {
    for(r = 0; r < N; r++) {
      for(g = 0; g < N; g++) {
	for(b = 0; b < N; b++) {
	  hists[i][r][g][b] = 0;
	}
      }
    }
  }
  /* read in images and generate individual histograms */
  for(i = 0; i < 9; i++){
    if(readImageColor(&img, images[i]) == 0) {
      w = getNColsColor(&img);
      h = getNRowsColor(&img);

      setSizeColor(&img_n,ceil((float)h/R),ceil((float)w/R));
      setColorsColor(&img_n,N); 

      for(x = 0, j = 0; x < w; x += R, j++){
	for(y = 0, k = 0; y < h; y += R, k++) {
	  r = getPixelColor(&img,y,x,1);
	  g = getPixelColor(&img,y,x,2);
	  b = getPixelColor(&img,y,x,3);

	  dr = r>>(8 - B);
	  dg = g>>(8 - B);
	  db = b>>(8 - B);

	  hists[i][dr][dg][db]++;
	  setPixelColor(&img_n,k,j,dr,dg,db); 
	  
	}
      }
      sprintf(norm_image,"normalized/%d_%d_n%d.ppm",B,R,i);
      writeImageColor(&img_n,norm_image);
    } else {
      printf("error reading %s\n",images[i]);
      exit(1);
    }
  }
  /* calculate norms */

  for(i = 0; i < 9; i++) {
    for(j = i+1; j < 9; j++) {
      t = 0;
      for(r = 0; r < N; r++) {
	for(g = 0; g < N; g++) {
	  for(b = 0; b < N; b++) {
	    t += abs(hists[i][r][g][b] - hists[j][r][g][b]);
	  }
	}
      } 
      norms[i][j] = (float)t/((ceil(((float)w/R))) * (ceil(((float)h/R))) * 2);
    }
  }

  /* find minimum difference */
  for(i = 0; i < 9; i++) {
    for(j = i+1; j < 9; j++) {
      if(norms[i][j] < min){
	min = norms[i][j];
	mini = i;
	minj = j;
      }
    }
  }
 
  printf("(B = %d, R = %d): %s and %s were most similar (%f)\n",B,R,images[mini],images[minj],min);
  return 0;
}

