/* correct140.cpp - applies correction for non-uniform lighting */ static char *usage ="\n usage: %s in.png out.png prr px py p1 [map.png]\n"; #include "imageLib.h" #include "math.h" #include #define VERBOSE 1 #define ROUND(x) ((x) >= 0? ((int)((x) + .5)) : ((int)((x) - .5))) #define SATURATION 251 int main(int argc, char *argv[]) { try { if (argc < 6) throw CError(usage, argv[0]); int argn = 1; char *infile = argv[argn++]; char *outfile = argv[argn++]; float prr = atof(argv[argn++]); float px = atof(argv[argn++]); float py = atof(argv[argn++]); float p1 = atof(argv[argn++]); char *mapfile = (argn < argc) ? argv[argn++] : NULL; CByteImage im; ReadImageVerb(im, infile, VERBOSE); CShape sh = im.Shape(); int w = sh.width, h = sh.height; int s = w/14; if (14*s != w || 10*s != h) throw CError("14x10 aspect ratio expected"); sh.nBands = 1; CByteImage map(sh); for(int y = 0; y < h; y++){ for(int x = 0; x < w; x++){ float fy = ((float)y - h/2.0) / (float)s; float fx = ((float)x - w/2.0) / (float)s; float frr = fx * fx + fy * fy; float f = prr * frr + px * fx + py * fy + p1; for (int b = 0; b < 3; b++){ int v = im.Pixel(x, y, b); // don't decrease saturated values if (f <= 1.0 || v < SATURATION) im.Pixel(x, y, b) = __min(255, __max(0, ROUND(v / f))); } map.Pixel(x, y, 0) = __min(255, __max(0, 128 + ROUND(500*(f-1)))); } } WriteImageVerb(im, outfile, VERBOSE); if (mapfile) WriteImageVerb(map, mapfile, VERBOSE); } catch (CError &err) { fprintf(stderr, err.message); fprintf(stderr, "\n"); return -1; } return 0; }