#include #include #include #include #include #include "../guicast/linklist.h" class HistEq { void fit(int *dat, int n, double &a, double &b); public: void eq(unsigned char *dp, int len); HistEq() {} ~HistEq() {} }; double mean(uint8_t *dat, int n) { int s = 0; for( int i=0; imx ? mx : v; } void HistEq:: fit(int *dat, int n, double &a, double &b) { double st2 = 0, sb = 0; int64_t sy = 0; for( int i=0; i=0; ++bp ) ++hist[*bp]; int t = 0; for( int i=0; i<256; ++i ) { t += hist[i]; wts[i] = t; } int lmn = len/20, lmx = len-lmn; int mn = 0; while( mn < 256 && wts[mn] < lmn ) ++mn; int mx = 255; while( mx > mn && wts[mx] > lmx ) --mx; double a, b; fit(&wts[mn], mx-mn, a, b); double r = 256./len; double a1 = (a - b*mn) * r, b1 = b * r; for( int i=0 ; i<256; ++i ) map[i] = clip(a1 + i*b1, 0, 255); bp = dp; for( int i=len; --i>=0; ++bp ) *bp = map[*bp]; } int main(int ac, char **av) { FILE *ifp = !strcmp(av[1],"-") ? stdin : fopen(av[1],"r"); FILE *ofp = !strcmp(av[2],"-") ? stdout : fopen(av[2],"w"); char line[120]; fgets(line,sizeof(line),ifp); fputs(line,ofp); fgets(line,sizeof(line),ifp); fputs(line,ofp); int w, h; if( sscanf(line,"%d %d\n",&w,&h) != 2 ) exit(1); fgets(line,sizeof(line),ifp); fputs(line,ofp); int len = w*h; unsigned char data[len], *bp = data; for( int ch, i=len; --i>=0 && (ch=getc(ifp)) >= 0; ++bp ) *bp = ch; HistEq().eq(data,len); bp = data; for( int i=len; --i>=0; ++bp ) putc(*bp,ofp); if( ifp != stdin ) fclose(ifp); if( ofp != stdout ) fclose(ofp); return 0; }