Changeset 26035 for trunk/psModules/src/imcombine/pmSubtraction.c
- Timestamp:
- Nov 4, 2009, 4:52:05 PM (17 years ago)
- File:
-
- 1 edited
-
trunk/psModules/src/imcombine/pmSubtraction.c (modified) (17 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules/src/imcombine/pmSubtraction.c
r25999 r26035 29 29 #define PIXEL_LIST_BUFFER 100 // Number of entries to add to pixel list at a time 30 30 #define MIN_SAMPLE_STATS 7 // Minimum number to use sample statistics; otherwise use quartiles 31 #define USE_ SYS_ERR // Use systematicerror image?31 #define USE_KERNEL_ERR // Use kernel error image? 32 32 33 33 ////////////////////////////////////////////////////////////////////////////////////////////////////////////// … … 266 266 static void convolveVarianceFFT(psImage *target,// Place the result in here 267 267 psImage *variance, // Variance map to convolve 268 psImage * sys, // Systematicerror image268 psImage *kernelErr, // Kernel error image 269 269 psImage *mask, // Mask image 270 270 psImageMaskType maskVal, // Value to mask … … 278 278 279 279 psImage *subVariance = variance ? psImageSubset(variance, border) : NULL; // Variance map 280 psImage *sub Sys = sys ? psImageSubset(sys, border) : NULL; // Systematicerror image280 psImage *subKE = kernelErr ? psImageSubset(kernelErr, border) : NULL; // Kernel error image 281 281 psImage *subMask = mask ? psImageSubset(mask, border) : NULL; // Mask 282 282 283 283 // XXX Can trim this a little by combining the convolution: only have to take the FFT of the kernel once 284 284 psImage *convVariance = psImageConvolveFFT(NULL, subVariance, subMask, maskVal, kernel); // Convolved variance 285 psImage *conv Sys = subSys ? psImageConvolveFFT(NULL, subSys, subMask, maskVal, kernel) : NULL; // Conv sys285 psImage *convKE = subKE ? psImageConvolveFFT(NULL, subKE, subMask, maskVal, kernel) : NULL; // Conv KE 286 286 287 287 psFree(subVariance); 288 psFree(sub Sys);288 psFree(subKE); 289 289 psFree(subMask); 290 290 291 291 // Now, we have to stick it in where it belongs 292 292 int xMin = region.x0, xMax = region.x1, yMin = region.y0, yMax = region.y1; // Bounds of region 293 if (conv Sys) {293 if (convKE) { 294 294 for (int yTarget = yMin, ySource = size; yTarget < yMax; yTarget++, ySource++) { 295 295 for (int xTarget = xMin, xSource = size; xTarget < xMax; xTarget++, xSource++) { 296 296 target->data.F32[yTarget][xTarget] = convVariance->data.F32[ySource][xSource] + 297 conv Sys->data.F32[ySource][xSource];297 convKE->data.F32[ySource][xSource]; 298 298 } 299 299 } … … 306 306 307 307 psFree(convVariance); 308 psFree(conv Sys);308 psFree(convKE); 309 309 310 310 return; … … 342 342 psImage *image, // Image to convolve 343 343 psImage *variance, // Variance map to convolve, or NULL 344 psImage * sys, // Systematicerror image, or NULL344 psImage *kernelErr, // Kernel error image, or NULL 345 345 psImage *subMask, // Subtraction mask 346 346 const pmSubtractionKernels *kernels, // Kernels … … 379 379 convolveFFT(convImage, image, subMask, subBad, *kernelImage, region, background, kernels->size); 380 380 if (variance) { 381 convolveVarianceFFT(convVariance, variance, sys, subMask, subBad, *kernelVariance, region, kernels->size); 381 convolveVarianceFFT(convVariance, variance, kernelErr, subMask, subBad, *kernelVariance, 382 region, kernels->size); 382 383 } 383 384 } else { … … 429 430 } 430 431 431 #ifdef USE_ SYS_ERR432 // Generate an image that can be used to track systematic errors 433 static psImage *subtraction SysErrImage(const psImage *image, // Image from which to make sys err image434 float sysError // Relative systematic error435 )436 { 437 if (!isfinite( sysError) || sysError == 0.0) {432 #ifdef USE_KERNEL_ERR 433 // Generate an image that can be used to track systematic errors in the kernel 434 static psImage *subtractionKernelErrImage(const psImage *image, // Image from which to make kernel error image 435 float kernelError // Relative systematic error in kernel 436 ) 437 { 438 if (!isfinite(kernelError) || kernelError == 0.0) { 438 439 return NULL; 439 440 } 440 441 441 442 int numCols = image->numCols, numRows = image->numRows; // Size of image 442 psImage * sys = psImageAlloc(numCols, numRows, PS_TYPE_F32); // Systematicerror image443 444 float sysError2 = PS_SQR(sysError); // Square of the systematicerror443 psImage *kernelErr = psImageAlloc(numCols, numRows, PS_TYPE_F32); // Kernel error image 444 445 float kernelError2 = PS_SQR(kernelError); // Square of the kernel error 445 446 for (int y = 0; y < numRows; y++) { 446 447 for (int x = 0; x < numCols; x++) { 447 sys->data.F32[y][x] = PS_SQR(image->data.F32[y][x]) * sysError2;448 } 449 } 450 451 return sys;448 kernelErr->data.F32[y][x] = PS_SQR(image->data.F32[y][x]) * kernelError2; 449 } 450 } 451 452 return kernelErr; 452 453 } 453 454 #endif … … 892 893 psFree(stamp->image1); 893 894 psFree(stamp->image2); 894 psFree(stamp-> variance);895 stamp->image1 = stamp->image2 = stamp-> variance= NULL;895 psFree(stamp->weight); 896 stamp->image1 = stamp->image2 = stamp->weight = NULL; 896 897 psFree(stamp->matrix1); 897 898 psFree(stamp->matrix2); … … 1040 1041 psImage *convMask, // Output convolved mask 1041 1042 const pmReadout *ro1, const pmReadout *ro2, // Input readouts 1042 psImage * sys1, psImage *sys2, // Systematicerror images1043 psImage *kernelErr1, psImage *kernelErr2, // Kernel error images 1043 1044 psImage *subMask, // Input subtraction mask 1044 1045 psImageMaskType maskBad, // Mask value to give bad pixels … … 1066 1067 if (kernels->mode == PM_SUBTRACTION_MODE_1 || kernels->mode == PM_SUBTRACTION_MODE_DUAL) { 1067 1068 convolveRegion(out1->image, out1->variance, convMask, &kernelImage, &kernelVariance, 1068 ro1->image, ro1->variance, sys1, subMask, kernels, polyValues, background, *region,1069 maskBad, maskPoor, poorFrac, useFFT, false);1069 ro1->image, ro1->variance, kernelErr1, subMask, kernels, polyValues, background, 1070 *region, maskBad, maskPoor, poorFrac, useFFT, false); 1070 1071 } 1071 1072 if (kernels->mode == PM_SUBTRACTION_MODE_2 || kernels->mode == PM_SUBTRACTION_MODE_DUAL) { 1072 1073 convolveRegion(out2->image, out2->variance, convMask, &kernelImage, &kernelVariance, 1073 ro2->image, ro2->variance, sys2, subMask, kernels, polyValues, background, *region, 1074 maskBad, maskPoor, poorFrac, useFFT, kernels->mode == PM_SUBTRACTION_MODE_DUAL); 1074 ro2->image, ro2->variance, kernelErr2, subMask, kernels, polyValues, background, 1075 *region, maskBad, maskPoor, poorFrac, useFFT, 1076 kernels->mode == PM_SUBTRACTION_MODE_DUAL); 1075 1077 } 1076 1078 … … 1117 1119 const pmReadout *ro1 = args->data[7]; // Input readout 1 1118 1120 const pmReadout *ro2 = args->data[8]; // Input readout 2 1119 psImage * sys1 = args->data[9]; // Systematicerror image 11120 psImage * sys2 = args->data[10]; // Systematicerror image 21121 psImage *kernelErr1 = args->data[9]; // Kernel error image 1 1122 psImage *kernelErr2 = args->data[10]; // Kernel error image 2 1121 1123 psImage *subMask = args->data[11]; // Subtraction mask 1122 1124 psImageMaskType maskBad = PS_SCALAR_VALUE(args->data[12], PS_TYPE_IMAGE_MASK_DATA); // Output mask value for bad pixels … … 1128 1130 bool useFFT = PS_SCALAR_VALUE(args->data[18], U8); // Use FFT for convolution? 1129 1131 1130 return subtractionConvolvePatch(numCols, numRows, x0, y0, out1, out2, convMask, ro1, ro2, sys1, sys2, 1131 subMask, maskBad, maskPoor, poorFrac, region, kernels, doBG, useFFT); 1132 return subtractionConvolvePatch(numCols, numRows, x0, y0, out1, out2, convMask, ro1, ro2, kernelErr1, 1133 kernelErr2, subMask, maskBad, maskPoor, poorFrac, region, kernels, 1134 doBG, useFFT); 1132 1135 } 1133 1136 1134 1137 bool pmSubtractionConvolve(pmReadout *out1, pmReadout *out2, const pmReadout *ro1, const pmReadout *ro2, 1135 1138 psImage *subMask, int stride, psImageMaskType maskBad, psImageMaskType maskPoor, 1136 float poorFrac, float sysError, const psRegion *region,1139 float poorFrac, float kernelError, const psRegion *region, 1137 1140 const pmSubtractionKernels *kernels, bool doBG, bool useFFT) 1138 1141 { … … 1172 1175 PS_ASSERT_FLOAT_LARGER_THAN_OR_EQUAL(poorFrac, 0.0, false); 1173 1176 PS_ASSERT_FLOAT_LESS_THAN_OR_EQUAL(poorFrac, 1.0, false); 1174 PS_ASSERT_FLOAT_LARGER_THAN_OR_EQUAL( sysError, 0.0, false);1175 PS_ASSERT_FLOAT_LESS_THAN_OR_EQUAL( sysError, 1.0, false);1177 PS_ASSERT_FLOAT_LARGER_THAN_OR_EQUAL(kernelError, 0.0, false); 1178 PS_ASSERT_FLOAT_LESS_THAN_OR_EQUAL(kernelError, 1.0, false); 1176 1179 if (region && psRegionIsNaN(*region)) { 1177 1180 psString string = psRegionToString(*region); … … 1232 1235 } 1233 1236 1234 psImage * sys1 = NULL, *sys2 = NULL; // Systematicerror images1235 #ifdef USE_ SYS_ERR1237 psImage *kernelErr1 = NULL, *kernelErr2 = NULL; // Kernel error images 1238 #ifdef USE_KERNEL_ERR 1236 1239 if (kernels->mode == PM_SUBTRACTION_MODE_1 || kernels->mode == PM_SUBTRACTION_MODE_DUAL) { 1237 sys1 = subtractionSysErrImage(ro1->image, sysError);1240 kernelErr1 = subtractionKernelErrImage(ro1->image, kernelError); 1238 1241 } 1239 1242 if (kernels->mode == PM_SUBTRACTION_MODE_2 || kernels->mode == PM_SUBTRACTION_MODE_DUAL) { 1240 sys2 = subtractionSysErrImage(ro2->image, sysError);1243 kernelErr2 = subtractionKernelErrImage(ro2->image, kernelError); 1241 1244 } 1242 1245 #endif … … 1289 1292 psArrayAdd(args, 1, (pmReadout*)ro1); // Casting away const 1290 1293 psArrayAdd(args, 1, (pmReadout*)ro2); // Casting away const 1291 psArrayAdd(args, 1, sys1);1292 psArrayAdd(args, 1, sys2);1294 psArrayAdd(args, 1, kernelErr1); 1295 psArrayAdd(args, 1, kernelErr2); 1293 1296 psArrayAdd(args, 1, subMask); 1294 1297 PS_ARRAY_ADD_SCALAR(args, maskBad, PS_TYPE_IMAGE_MASK); … … 1306 1309 psFree(job); 1307 1310 } else { 1308 subtractionConvolvePatch(numCols, numRows, x0, y0, out1, out2, convMask, ro1, ro2, sys1, sys2,1309 subMask, maskBad, maskPoor, poorFrac, subRegion, kernels, doBG,1310 useFFT);1311 subtractionConvolvePatch(numCols, numRows, x0, y0, out1, out2, convMask, ro1, ro2, 1312 kernelErr1, kernelErr2, subMask, maskBad, maskPoor, poorFrac, 1313 subRegion, kernels, doBG, useFFT); 1311 1314 } 1312 1315 psFree(subRegion); … … 1333 1336 psImageConvolveSetThreads(oldThreads); 1334 1337 1335 psFree( sys1);1336 psFree( sys2);1338 psFree(kernelErr1); 1339 psFree(kernelErr2); 1337 1340 1338 1341 // Calculate covariances
Note:
See TracChangeset
for help on using the changeset viewer.
