Changeset 3610
- Timestamp:
- Mar 31, 2005, 5:07:12 PM (21 years ago)
- Location:
- trunk/stac/src
- Files:
-
- 8 edited
-
Makefile (modified) (3 diffs)
-
stac.c (modified) (5 diffs)
-
stac.h (modified) (6 diffs)
-
stacCombine.c (modified) (2 diffs)
-
stacConfig.c (modified) (15 diffs)
-
stacRead.c (modified) (3 diffs)
-
stacSize.c (modified) (1 diff)
-
stacTransform.c (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/stac/src/Makefile
r3387 r3610 1 1 SHELL = /bin/sh 2 2 CC = gcc 3 CFLAGS += -g -std=c99 -I/home/mithrandir/price/psLib/include -D CRFLUX -DTESTING4 PSLIB += -L/home/mithrandir/price/psLib/lib/ -lpslib -lgsl -lgslcblas -lfftw3f -lsla -lcfitsio -lm -lxml2 3 CFLAGS += -g -std=c99 -I/home/mithrandir/price/psLib/include -D_GNU_SOURCE # -DCRFLUX -DTESTING 4 PSLIB += -L/home/mithrandir/price/psLib/lib/ -lpslib -lgsl -lgslcblas -lfftw3f -lsla -lcfitsio -lm -lxml2 -lmysqlclient 5 5 LDFLAGS += $(PSLIB) 6 6 7 7 STAC = stac.o stacConfig.o stacRead.o stacErrorImages.o stacTransform.o stacCheckMemory.o \ 8 stacCombine.o stacInvertMaps.o stacRejection.o stacAreaOfInterest.o stacSize.o 8 stacCombine.o stacInvertMaps.o stacRejection.o stacAreaOfInterest.o stacSize.o stacScales.o 9 9 10 10 SHIFT = shift.o stacConfig.o stacRead.o stacErrorImages.o stacTransform.o stacCheckMemory.o \ … … 15 15 TEST_SHIFT = testShift.o stacConfig.o stacRead.o stacErrorImages.o stacTransform.o stacCheckMemory.o \ 16 16 stacInvertMaps.o 17 18 PHOTSCALE = photScale.o 17 19 18 20 .PHONY: tags clean empty test profile optimise … … 26 28 shift: $(SHIFT) 27 29 $(CC) $(CFLAGS) -o $@ $(SHIFT) $(LDFLAGS) $(OPTFLAGS) 30 31 photScale: $(PHOTSCALE) 32 $(CC) $(CFLAGS) -o $@ $(PHOTSCALE) $(LDFLAGS) $(OPTFLAGS) 28 33 29 34 calcGrad: calcGrad.o -
trunk/stac/src/stac.c
r3435 r3610 27 27 // Set trace levels 28 28 psTraceSetLevel(".",0); 29 psTraceSetLevel(".psLib", 0); 29 30 psTraceSetLevel("stac.checkMemory",10); 30 31 psTraceSetLevel("stac.config",10); … … 38 39 psTraceSetLevel("stac.area",10); 39 40 psTraceSetLevel("stac.size",10); 41 psTraceSetLevel("stac.scales",7); 40 42 41 43 // Set logging level … … 65 67 psArray *transformed = NULL; 66 68 psArray *transformedErrors = NULL; 67 (void)stacTransform(&transformed, &transformedErrors, inputs, inverseMaps, errors, NULL, NULL, config); 69 (void)stacTransform(&transformed, &transformedErrors, inputs, inverseMaps, errors, NULL, NULL, NULL, NULL, 70 config); 68 71 69 72 psTrace("stac.time",1,"Transformation completed at %f seconds\n", getTime() - startTime); 73 74 psVector *scales = NULL; // Relative scales between images 75 psVector *offsets = NULL; // Offsets between images 76 (void)stacScales(&scales, &offsets, transformed, config); 77 // Rescale the images 78 (void)stacRescale(transformed, transformedErrors, NULL, scales, offsets); 70 79 71 80 // Combine with rejection … … 122 131 } 123 132 124 // Redo transformation with the masks 133 // Redo transformation with the masks and scales/offsets 125 134 (void)stacTransform(&transformed, &transformedErrors, inputs, inverseMaps, errors, rejectedSource, 126 combineRegion, config);135 combineRegion, scales, offsets, config); 127 136 128 137 // Combine the newly-transformed CR-free images, no rejection … … 139 148 psFree(outFile); 140 149 150 // Save shifted images 151 if (config->saveShifts) { 152 for (int i = 0; i < transformed->n; i++) { 153 char shiftName[MAXCHAR]; // Filename of shifted image 154 sprintf(shiftName, "%s.shift", config->inputs->data[i]); 155 psFits *shiftFile = psFitsAlloc(shiftName); 156 if (!psFitsWriteImage(shiftFile, NULL, transformed->data[i], 0, NULL)) { 157 psErrorStackPrint(stderr, "Unable to write image: %s\n", shiftName); 158 } 159 psTrace("stac", 1, "Shifted image %d written to %s\n", i, shiftName); 160 psFree(shiftFile); 161 } 162 } 163 141 164 // Free everything I've used 142 165 stacConfigFree(config); 166 psFree(scales); 167 psFree(offsets); 143 168 psFree(combineRegion); 144 169 psFree(regions); -
trunk/stac/src/stac.h
r2897 r3610 8 8 #define MAXCHAR 80 9 9 10 // Temporary implementation11 psPlaneTransform *psPlaneTransformAlloc(psS32 n1, psS32 n2);10 // Get the current time 11 double getTime(void); 12 12 13 13 /************************************************************************************************************/ … … 21 21 psArray *inputs; // Input file names 22 22 const char *output; // Output file name 23 bool saveShifts; // Save shifted images? 24 const char *starFile; // File with star coordinates 25 const char *starMapFile; // File with map for stars 23 26 int outnx, outny; // Size of output image 24 27 float xOffset, yOffset; // Offset to get lower-left corner at 0,0 25 float saturated; // Saturation level26 float bad; // Bad level28 psVector *saturated; // Saturation level for each image 29 psVector *bad; // Bad level for each image 27 30 float reject; // Rejection level 28 31 float frac; // Fraction of input pixel that must be masked before the pixel is … … 30 33 float grad; // Multiplier of the gradient 31 34 int nReject; // Number of rejection iterations 35 float xMapDiff, yMapDiff; // Difference between pure map and output image coordinates 36 float aper; // Aperture size (pixels) 32 37 } stacConfig; 33 38 … … 52 57 // Read the input files and return an array of images 53 58 psArray *stacReadImages(stacConfig *config); 59 60 // Read a file of coordinates (x,y) 61 psArray *stacReadCoords(const char *filename); 62 63 // Read a single map file and return the transformation 64 psPlaneTransform *stacReadMap(const char *filename); 54 65 55 66 // Read the map files and return an array of transformations … … 77 88 const psArray *masks, // Masks of input images 78 89 const psImage *region, // Region of interest for transformation 90 const psVector *scales, // Relative scales 91 const psVector *offsets, // Relative offsets 79 92 const stacConfig *config // Configuration 80 93 ); … … 181 194 /************************************************************************************************************/ 182 195 196 // stacScale.c 197 198 // Calculate the background in an image 199 float stacBackground(const psImage *image, // Image for which to get the background 200 int sample // Sample in increments of this value 201 ); 202 203 204 // Calculate the relative scales and offsets between the images 205 bool stacScales(psVector **scalesPtr, // Scales to return 206 psVector **offsetsPtr, // Offsets to return 207 const psArray *images, // Images on which to measure the scales and offsets 208 const stacConfig *config // Configuration 209 ); 210 211 // Rescale images 212 bool stacRescale(psArray *images, // Images to rescale 213 psArray *errImages, // Variance images to rescale 214 const psImage *mask, // Mask indicating which pixels to scale 215 const psVector *scales,// Scales for images 216 const psVector *offsets // Offsets for images 217 ); 218 183 219 #endif -
trunk/stac/src/stacCombine.c
r3375 r3610 68 68 int numRows = ((psImage*)images->data[0])->numRows; // Image size 69 69 int numCols = ((psImage*)images->data[0])->numCols; // Image size 70 float saturated = config->saturated;// Saturation limit71 float bad = config->bad; // Bad pixel limit70 psVector *saturated = config->saturated;// Saturation limits 71 psVector *bad = config->bad; // Bad pixel limits 72 72 float reject = config->reject; // Rejection (k-sigma) 73 73 … … 134 134 pixels->data.F32[i] = pixel; 135 135 deltas->data.F32[i] = delta; 136 if ((pixel >= saturated) || (pixel <= bad) || (! isfinite(pixel)) || (! isfinite(delta))) { 136 if ((pixel >= saturated->data.F32[i]) || (pixel <= bad->data.F32[i]) || 137 (! isfinite(pixel)) || (! isfinite(delta))) { 137 138 mask->data.U8[i] = (psU8)1; // Don't use! 138 139 } else { -
trunk/stac/src/stacConfig.c
r3387 r3610 9 9 { 10 10 fprintf (stderr, "STAC: Simultaneous Telescope Array Combination\n" 11 "Usage: %s [-h] [-v] [-g GAIN] [-r RN] [-o NX NY] [- s SAT] [-b BAD] [-k REJ] [-n NREJECT] [-k FRAC] [-G GRAD] OUT IN1 IN2...\n"11 "Usage: %s [-h] [-v] [-g GAIN] [-r RN] [-o NX NY] [-S] [-s SAT] [-b BAD] [-p FILE MAP] [-a APER] [-k REJ] [-n NREJECT] [-k FRAC] [-G GRAD] OUT IN1 IN2...\n" 12 12 "where\n" 13 13 "\t-h Help (this info)\n" … … 16 16 "\t-r Read noise (e) for detectors\n" 17 17 "\t-o NX NY Size of output image (512, 512)\n" 18 "\t-s SAT Saturation level (65536)\n" 18 "\t-S Save shifted images (false)\n" 19 "\t-s SAT Saturation level (65535)\n" 19 20 "\t-b BAD Bad level (0)\n" 21 "\t-p FILE MAP Specify file containing star coordinates, with map\n" 22 "\t-a APER Aperture size to use for photometry (3 pix)\n" 20 23 "\t-k REJ Rejection level (k-sigma; 3.5)\n" 21 24 "\t-n NREJECT Number of rejection iterations (2)\n" … … 39 42 config->inputs = NULL; 40 43 config->output = NULL; 44 config->saveShifts = false; 45 config->starFile = NULL; 46 config->starMapFile = NULL; 47 config->aper = 3.0; 41 48 config->outnx = 512; 42 49 config->outny = 512; 43 config->saturated = 65535.0;44 config->bad = 0.0;50 config->saturated = NULL; // Saturations; will fill this in later, when we know how many images 51 config->bad = NULL; // Bad levels; will fill this in later, when we know how many images 45 52 config->reject = 3.0; 46 53 config->frac = 0.5; … … 54 61 void stacConfigFree(stacConfig *config) 55 62 { 56 // Free the vector , if necessary63 // Free the vectors, if necessary 57 64 if (config->inputs) { 58 65 psFree(config->inputs); 66 } 67 if (config->saturated) { 68 psFree(config->saturated); 69 } 70 if (config->bad) { 71 psFree(config->bad); 59 72 } 60 73 // Free everything … … 69 82 stacConfig *config = stacConfigAlloc(); // Configuration values 70 83 const char *programName = argv[0]; // Program name 84 85 float saturated = 65535.0; // Saturation level 86 float bad = 0.0; // Bad level 71 87 72 88 /* Variables for getopt */ … … 76 92 77 93 /* Parse command-line arguments using getopt */ 78 while ((opt = getopt(argc, argv, "hv g:r:o:s:b:k:n:f:G:")) != -1) {94 while ((opt = getopt(argc, argv, "hvSg:r:o:s:b:k:n:f:G:p:a:")) != -1) { 79 95 switch (opt) { 80 96 case 'h': … … 87 103 if (sscanf(optarg, "%f", &config->gain) != 1) { 88 104 help(programName); 105 exit(EXIT_FAILURE); 89 106 } 90 107 break; … … 92 109 if (sscanf(optarg, "%f", &config->readnoise) != 1) { 93 110 help(programName); 111 exit(EXIT_FAILURE); 94 112 } 95 113 break; … … 97 115 if ((sscanf(argv[optind-1], "%d", &config->outnx) != 1) || 98 116 (sscanf(argv[optind++], "%d", &config->outny) != 1)) { 99 /* 100 Note: incrementing optind, so I can read more than 101 one parameter. 102 */ 117 // Note: incrementing optind, so I can read more than one parameter. 103 118 help(programName); 104 119 exit(EXIT_FAILURE); … … 106 121 break; 107 122 case 's': 108 if (sscanf(optarg, "%f", &config->saturated) != 1) { 109 help(programName); 123 if (sscanf(optarg, "%f", &saturated) != 1) { 124 help(programName); 125 exit(EXIT_FAILURE); 110 126 } 111 127 break; 112 128 case 'b': 113 if (sscanf(optarg, "%f", &config->bad) != 1) { 114 help(programName); 129 if (sscanf(optarg, "%f", &bad) != 1) { 130 help(programName); 131 exit(EXIT_FAILURE); 132 } 133 break; 134 case 'p': 135 if (argc < optind+1) { 136 help(programName); 137 exit(EXIT_FAILURE); 138 } 139 config->starFile = argv[optind-1]; 140 config->starMapFile = argv[optind++]; 141 // Note: incrementing optind, so I can read more than one parameter. 142 break; 143 case 'a': 144 if (sscanf(optarg, "%f", &config->aper) != 1) { 145 help(programName); 146 exit(EXIT_FAILURE); 115 147 } 116 148 break; … … 118 150 if (sscanf(optarg, "%f", &config->reject) != 1) { 119 151 help(programName); 152 exit(EXIT_FAILURE); 120 153 } 121 154 break; … … 123 156 if (sscanf(optarg, "%d", &config->nReject) != 1) { 124 157 help(programName); 158 exit(EXIT_FAILURE); 125 159 } 126 160 break; … … 128 162 if (sscanf(optarg, "%f", &config->frac) != 1) { 129 163 help(programName); 164 exit(EXIT_FAILURE); 130 165 } 131 166 break; … … 133 168 if (sscanf(optarg, "%f", &config->grad) != 1) { 134 169 help(programName); 135 } 170 exit(EXIT_FAILURE); 171 } 172 break; 173 case 'S': 174 config->saveShifts = true; 136 175 break; 137 176 default: … … 156 195 } 157 196 197 // Create the saturation and bad vectors 198 config->saturated = psVectorAlloc(argc-1, PS_TYPE_F32); 199 config->bad = psVectorAlloc(argc-1, PS_TYPE_F32); 200 for (int i = 0; i < argc - 1; i++) { 201 ((psVector*)config->saturated)->data.F32[i] = saturated; 202 ((psVector*)config->bad)->data.F32[i] = bad; 203 } 204 158 205 // Debugging output 159 206 psTrace("stac.config", 8, "Parsed command line for configuration\n"); -
trunk/stac/src/stacRead.c
r3375 r3610 3 3 #include "pslib.h" 4 4 #include "stac.h" 5 6 #define BUFFER 100 // Size of buffer for incrementally reading coordinates 5 7 6 8 psArray *stacReadImages(stacConfig *config) … … 40 42 } 41 43 44 psArray *stacReadCoords(const char *filename) 45 { 46 FILE *file = fopen(filename, "r"); 47 if (file == NULL) { 48 psLogMsg("stac.read.coords", PS_LOG_ERROR, "Cannot open coordinate file, %s\n", filename); 49 return NULL; 50 } 51 52 psTrace("stac.read.coords", 5, "Reading coordinate file, %s\n", filename); 53 54 psArray *coords = psArrayAlloc(BUFFER); // The array of coordinates to be returned 55 float x, y; // Coordinates to read 56 int num = 0; // Number of coordinates read 57 while (fscanf(file, "%f %f\n", &x, &y) == 2) { 58 psPlane *coord = psPlaneAlloc();// A coordinate 59 coord->x = x; 60 coord->y = y; 61 coords->data[num] = coord; 62 num++; 63 if (num % BUFFER) { 64 coords = psArrayRealloc(coords, num + BUFFER); 65 } 66 } 67 coords->n = num; 68 69 psTrace("stac.read.coords", 5, "%d coordinates read.\n", num); 70 71 fclose(file); 72 return coords; 73 } 74 75 76 psPlaneTransform *stacReadMap(const char *filename) 77 { 78 FILE *mapfp = fopen(filename, "r"); 79 if (mapfp == NULL) { 80 psLogMsg("stac.read.map", PS_LOG_ERROR, "Cannot open map file, %s\n", filename); 81 return NULL; 82 } 83 // Read the file 84 psTrace("stac.read.map", 5, "Reading map file %s....\n", filename); 85 86 // Format is now: 87 // order 88 // x coefficients 89 // y coefficients 90 // 91 // where the order is 1 for linear, 2 for quadratic, 3 for cubic. 92 // and the coefficients are read by the following pseudo-code: 93 // 94 // for (int k = 0; k < order + 1; k++) 95 // for (int j = 0; j < k; j++) 96 // int i = k - j; 97 // read coefficient of x^i y^j 98 // 99 // This produces the ordering: 100 // x^0 y^0, x^1 y^0, x^0 y^1, x^2 y^0, x^1 y^1, x^0 y^2, x^3 y^0, x^2 y^1, x^1 y^2, x^0 y^3 101 // 102 // This is, of course, for third order polynomials. 103 // For lower orders, the list is truncated at the appropriate level. 104 105 int order = 0; // Polynomial order 106 if (fscanf(mapfp, "%d", &order) != 1) { 107 psLogMsg("stac.read.map", PS_LOG_ERROR, "Unable to read map file %s\n", filename); 108 fclose(mapfp); 109 return NULL; 110 } 111 112 psTrace("stac.read.map", 5, "Polynomial order: %d\n", order); 113 114 psPlaneTransform *map = psPlaneTransformAlloc(order + 1, order + 1); // The transformation 115 // Set coefficient masks 116 for (int i = 0; i < order + 1; i++) { 117 for (int j = 0; j < order + 1; j++) { 118 if (i + j > order + 1) { 119 map->x->mask[i][j] = 1; 120 map->y->mask[i][j] = 1; 121 } else { 122 map->x->mask[i][j] = 0; 123 map->y->mask[i][j] = 0; 124 } 125 } 126 } 127 128 // Read x coefficients 129 psTrace("stac.read.map", 7, "x' = \n"); 130 for (int k = 0; k < order + 1; k++) { 131 for (int j = 0; j < k + 1; j++) { 132 int i = k - j; 133 if (fscanf(mapfp, "%lf", &map->x->coeff[i][j]) != 1) { 134 psLogMsg("stac.read.map", PS_LOG_ERROR, "Unable to read map file %s\n", filename); 135 fclose(mapfp); 136 psFree(map); 137 return NULL; 138 } 139 psTrace("stac.read.map", 7, " %f x^%d y^%d\n", map->x->coeff[i][j], i, j); 140 } 141 } 142 // Read y coefficients 143 psTrace("stac.read.maps", 7, "y' = \n"); 144 for (int k = 0; k < order + 1; k++) { 145 for (int j = 0; j < k + 1; j++) { 146 int i = k - j; 147 if (fscanf(mapfp, "%lf", &map->y->coeff[i][j]) != 1) { 148 psLogMsg("stac.read.map", PS_LOG_ERROR, "Unable to read map file %s\n", filename); 149 fclose(mapfp); 150 psFree(map); 151 return NULL; 152 } 153 psTrace("stac.read.map", 7, " %f x^%d y^%d\n", map->y->coeff[i][j], i, j); 154 } 155 } 156 157 fclose(mapfp); 158 159 return map; 160 } 161 162 42 163 43 164 psArray *stacReadMaps(stacConfig *config) … … 54 175 exit(EXIT_FAILURE); 55 176 } 56 // Openthe file177 // Read the file 57 178 sprintf(mapfile,"%s.map",filenames->data[i]); 58 FILE *mapfp = fopen(mapfile,"r"); 59 if (mapfp == NULL) { 60 psLogMsg("stac.read.maps", PS_LOG_ERROR, "Cannot open map file, %s\n",mapfile); 61 exit(EXIT_FAILURE); 179 maps->data[i] = stacReadMap(mapfile); 180 if (maps->data[i] == NULL) { 181 psLogMsg("stac.read.maps", PS_LOG_ERROR, "Unable to read map: %s\n", mapfile); 62 182 } 63 // Read the file64 psTrace("stac.read.maps",5,"Reading map file %s....\n",mapfile);65 66 // Format is now:67 // order68 // x coefficients69 // y coefficients70 //71 // where the order is 1 for linear, 2 for quadratic, 3 for cubic.72 // and the coefficients are read by the following pseudo-code:73 //74 // for (int k = 0; k < order + 1; k++)75 // for (int j = 0; j < k; j++)76 // int i = k - j;77 // read coefficient of x^i y^j78 //79 // This produces the ordering:80 // x^0 y^0, x^1 y^0, x^0 y^1, x^2 y^0, x^1 y^1, x^0 y^2, x^3 y^0, x^2 y^1, x^1 y^2, x^0 y^381 //82 // This is, of course, for third order polynomials.83 // For lower orders, the list is truncated at the appropriate level.84 85 int order = 0; // Polynomial order86 if (fscanf(mapfp, "%d", &order) != 1) {87 psLogMsg("stac.read.maps", PS_LOG_ERROR, "Unable to read map file %s\n", mapfile);88 exit(EXIT_FAILURE);89 }90 91 psTrace("stac.read.maps", 5, "Polynomial order: %d\n", order);92 93 psPlaneTransform *map = psPlaneTransformAlloc(order + 1, order + 1); // The transformation94 // Set coefficient masks95 for (int i = 0; i < order + 1; i++) {96 for (int j = 0; j < order + 1; j++) {97 if (i + j > order + 1) {98 map->x->mask[i][j] = 1;99 map->y->mask[i][j] = 1;100 } else {101 map->x->mask[i][j] = 0;102 map->y->mask[i][j] = 0;103 }104 }105 }106 107 // Read x coefficients108 psTrace("stac.read.maps", 7, "x' = \n");109 for (int k = 0; k < order + 1; k++) {110 for (int j = 0; j < k + 1; j++) {111 int i = k - j;112 if (fscanf(mapfp, "%lf", &map->x->coeff[i][j]) != 1) {113 psLogMsg("stac.read.maps", PS_LOG_ERROR, "Unable to read map file %s\n", mapfile);114 exit(EXIT_FAILURE);115 }116 psTrace("stac.read.maps", 7, " %f x^%d y^%d\n", map->x->coeff[i][j], i, j);117 }118 }119 // Read y coefficients120 psTrace("stac.read.maps", 7, "y' = \n");121 for (int k = 0; k < order + 1; k++) {122 for (int j = 0; j < k + 1; j++) {123 int i = k - j;124 if (fscanf(mapfp, "%lf", &map->y->coeff[i][j]) != 1) {125 psLogMsg("stac.read.maps", PS_LOG_ERROR, "Unable to read map file %s\n", mapfile);126 exit(EXIT_FAILURE);127 }128 psTrace("stac.read.maps", 7, " %f x^%d y^%d\n", map->y->coeff[i][j], i, j);129 }130 }131 132 fclose(mapfp);133 134 // Plug it into the array135 maps->data[i] = map;136 183 137 184 } -
trunk/stac/src/stacSize.c
r3469 r3610 91 91 92 92 // Tweak the maps to account for the offset 93 config->xMapDiff = floor(xMin); 94 config->yMapDiff = floor(yMin); 93 95 for (int i = 0; i < nImages; i++) { 94 96 psPlaneTransform *map = maps->data[i]; // The map of interest -
trunk/stac/src/stacTransform.c
r3387 r3610 113 113 const psArray *masks, // Masks of input images 114 114 const psImage *region, // Region of interest for transformation 115 const psVector *scales, // Relative scales 116 const psVector *offsets, // Relative offsets 115 117 const stacConfig *config // Configuration 116 118 ) … … 123 125 assert(images->n == maps->n); 124 126 assert(!errors || (images->n == errors->n)); 127 assert(!scales || scales->n == images->n); 128 assert(!offsets || offsets->n == images->n); 129 assert(!scales || scales->type.type == PS_TYPE_F32); 130 assert(!offsets || offsets->type.type == PS_TYPE_F32); 125 131 126 132 // Allocate the output images if required, otherwise check the number … … 170 176 psImage *outImage = (*outputs)->data[n]; // The output image 171 177 psImage *outError = (*outErrors)->data[n]; // The output error image 178 float offset = 0.0; // Relative offset 179 float scale = 1.0; // Relative scale 180 if (offsets) { 181 offset = offsets->data.F32[n]; 182 } 183 if (scales) { 184 scale = scales->data.F32[n]; 185 } 172 186 173 187 #if 0 … … 206 220 detector->y, 207 221 mask, 1, 0.0); 222 223 outImage->data.F32[y][x] = (outImage->data.F32[y][x] - offset) / scale; 224 outImage->data.F32[y][x] = outImage->data.F32[y][x] / SQUARE(scale); 225 208 226 } // Pixels of interest 209 227
Note:
See TracChangeset
for help on using the changeset viewer.
