initial commit
[goodguy/history.git] / cinelerra-5.0 / db / utils / histeq.C.sav1
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<string.h>
4
5 void hist_eq(unsigned char *data, int len, int n)
6 {
7   while( --n >= 0 ) {
8     int hist[256];
9     for( int i=0; i<256; ++i ) hist[i] = 0;
10     unsigned char *bp = data;
11     for( int i=len; --i>=0; ++bp ) ++hist[*bp];
12     for( int t=0, i=0; i<256; ++i ) { t += hist[i];  hist[i] = t; }
13
14     int mn = 0;    while( mn<255 && !hist[mn] ) ++mn;
15     int mx = 256;  while( mx>mn && hist[mx-1]==len ) --mx;
16     double r = (double)(mx - mn) / (256-1);
17     int map[256];  map[0] = 0;  map[255] = 255;
18     double dv = (len-1) / 256., v = dv;
19     for( int i=1; i<255; ++i, v+=dv ) {
20       int j = i * r + mn;
21       map[i] = i * (1-(v - hist[j])/len);
22     }
23 //for( int i=0; i<256; ++i ) fprintf(stderr,"%d\n",map[i]);
24     bp = data;
25     for( int i=len; --i>=0; ++bp ) *bp = map[*bp];
26   }
27 }
28
29 int main(int ac, char **av)
30 {
31   FILE *ifp = !strcmp(av[1],"-") ? stdin : fopen(av[1],"r");
32   FILE *ofp = !strcmp(av[2],"-") ? stdout : fopen(av[2],"w");
33   char line[120];
34   fgets(line,sizeof(line),ifp);  fputs(line,ofp);
35   fgets(line,sizeof(line),ifp);  fputs(line,ofp);
36   int w, h;  if( sscanf(line,"%d %d\n",&w,&h) != 2 ) exit(1);
37   fgets(line,sizeof(line),ifp);  fputs(line,ofp);
38   int len = w*h;
39   unsigned char data[len], *bp = data;
40   for( int ch, i=len; --i>=0 && (ch=getc(ifp)) >= 0; ++bp ) *bp = ch;
41   for( int i=1; --i>=0; ) hist_eq(data,len, 3);
42   bp = data;
43   for( int i=len; --i>=0; ++bp ) putc(*bp,ofp);
44
45   if( ifp != stdin ) fclose(ifp);
46   if( ofp != stdout ) fclose(ofp);
47   return 0;
48 }
49