Changeset 28667
- Timestamp:
- Jul 13, 2010, 2:34:04 PM (16 years ago)
- Location:
- trunk
- Files:
-
- 5 edited
-
archive/noise_model/simulate.c (modified) (18 diffs)
-
psLib/src/imageops/psImageCovariance.c (modified) (15 diffs)
-
psLib/src/imageops/psImageInterpolate.c (modified) (4 diffs)
-
psModules/src/imcombine/pmSubtraction.c (modified) (8 diffs)
-
psphot/src/psphotSignificanceImage.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/archive/noise_model/simulate.c
r28173 r28667 6 6 #define DET_SIZE 2000 7 7 #define SKY_SIZE 1000 8 #define SIZE 10249 8 #define OUTPUT_ROOT "test" 10 #define SCALE 0. 6543219 #define SCALE 0.7654321 11 10 #define ROT M_PI_2 12 #define INTERPOLATION PS_INTERPOLATE_LANCZOS 411 #define INTERPOLATION PS_INTERPOLATE_LANCZOS3 13 12 #define OFFSET 16 14 13 #define SMOOTH_SIGMA 6.54321 … … 16 15 #define DUAL_KERNEL "sub.subkernel" 17 16 #define WARP_NUM 10000 17 #define CONV_NUM 1000 18 18 19 19 static const float variances[] = { 3.0, 10.0, 30.0, 100.0, 300.0, 1000.0, 3000.0, 10000.0 }; … … 21 21 static const char *rootNames[] = { "o5298g0209o.fake.warp", "o5298g0210o.fake.warp", "o5298g0211o.fake.warp", 22 22 "o5298g0212o.fake.warp", "o5298g0213o.fake.warp", "o5298g0214o.fake.warp", 23 23 24 "o5298g0215o.fake.warp", "o5298g0216o.fake.warp" }; 25 #if 1 24 26 static const char *kernels[] = { "test.5.kernel", "test.11.kernel", "test.17.kernel", "test.23.kernel", 25 27 "test.29.kernel", "test.35.kernel", "test.41.kernel", "test.47.kernel" }; 26 28 #else 29 static const char *kernels[] = { "test.11.kernel", "test.11.kernel", "test.11.kernel", "test.11.kernel", 30 "test.11.kernel", "test.11.kernel", "test.11.kernel", "test.11.kernel" }; 31 #endif 27 32 28 33 void writeImage(const psImage *image, const char *suffix) … … 76 81 float meanVar(const psImage *var, const psImage *mask, const psKernel *covar) 77 82 { 78 psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS);79 83 psStats *stats = psStatsAlloc(PS_STAT_SAMPLE_MEDIAN); 80 psImage Background(stats, NULL, var, mask, 0xFF, rng);84 psImageStats(stats, var, mask, 0xFF); 81 85 float variance = stats->sampleMedian * psImageCovarianceFactor(covar); 82 86 psFree(stats); 83 psFree(rng);84 87 return variance; 85 88 } … … 93 96 for (int x = 0; x < image->numCols; x++) { 94 97 sn->data.F32[y][x] = image->data.F32[y][x] / sqrtf(var->data.F32[y][x] * varFactor); 98 if (!isfinite(sn->data.F32[y][x])) { 99 mask->data.PS_TYPE_IMAGE_MASK_DATA[y][x] = 0xFF; 100 } 95 101 } 96 102 } … … 100 106 float offset = stats->sampleMean; 101 107 psFree(stats); 108 109 static int number = 0; 110 111 psString snName = NULL; 112 psStringAppend(&snName, "sn.%d.fits", number); 113 writeImage(sn, snName); 114 fprintf(stderr, "Writing S/N image %d\n", number); 102 115 103 116 psHistogram *hist = psHistogramAlloc(-5, +5, 101); … … 121 134 psFree(sn); 122 135 123 static int number = 0;124 136 psString name = NULL; 125 137 fprintf(stderr, "Writing histogram %d\n", number); 126 psStringAppend(&name, "hist_%d.dat", number ++);138 psStringAppend(&name, "hist_%d.dat", number); 127 139 FILE *file = fopen(name, "w"); 128 140 psFree(name); … … 136 148 psFree(hist); 137 149 150 number++; 151 138 152 return noise; 139 153 } … … 144 158 { 145 159 psKernel *kernel2 = psKernelAlloc(kernel->xMin, kernel->xMax, kernel->yMin, kernel->yMax); 146 double sum = 0.0, sum2 = 0.0;147 160 for (int y = kernel->yMin; y <= kernel->yMax; y++) { 148 161 for (int x = kernel->xMin; x <= kernel->xMax; x++) { 149 sum += kernel->kernel[y][x]; 150 sum2 += kernel2->kernel[y][x] = PS_SQR(kernel->kernel[y][x]); 151 } 152 } 153 for (int y = kernel->yMin; y <= kernel->yMax; y++) { 154 for (int x = kernel->xMin; x <= kernel->xMax; x++) { 155 kernel2->kernel[y][x] /= sum2; 162 kernel2->kernel[y][x] = PS_SQR(kernel->kernel[y][x]); 156 163 } 157 164 } … … 176 183 177 184 psKernel *kernel = psImageSmoothKernel(SMOOTH_SIGMA, SMOOTH_N_SIGMA); // Kernel used for smoothing 185 double sum2 = 0.0; // Sum of kernel squared 186 for (int y = kernel->yMin; y <= kernel->yMax; y++) { 187 for (int x = kernel->xMin; x <= kernel->xMax; x++) { 188 sum2 += PS_SQR(kernel->kernel[y][x]); 189 } 190 } 191 float factor = 1.0 / sum2; 178 192 psKernel *smoothCovar = psImageCovarianceCalculate(kernel, covar); 179 193 psFree(kernel); 180 psImageCovarianceTransfer(smoothVariance, smoothCovar); 194 195 // Apply square root of significance image scaling factor to image 196 psBinaryOp(smoothImage, smoothImage, "*", psScalarAlloc(sqrtf(factor), PS_TYPE_F32)); 197 181 198 #else 182 199 psKernel *kernel = psImageSmoothKernel(SMOOTH_SIGMA, SMOOTH_N_SIGMA); // Kernel used for smoothing 183 200 psKernel *kernel2 = psKernelAlloc(kernel->xMin, kernel->xMax, kernel->yMin, kernel->yMax); 184 double sum = 0.0, sum2 = 0.0;185 201 for (int y = kernel->yMin; y <= kernel->yMax; y++) { 186 202 for (int x = kernel->xMin; x <= kernel->xMax; x++) { 187 sum += kernel->kernel[y][x]; 188 sum2 += kernel2->kernel[y][x] = PS_SQR(kernel->kernel[y][x]); 189 } 190 } 191 fprintf(stderr, "Kernel sum: %f %f\n", sum, sum2); 192 for (int y = kernel->yMin; y <= kernel->yMax; y++) { 193 for (int x = kernel->xMin; x <= kernel->xMax; x++) { 194 kernel2->kernel[y][x] /= sum2; 203 kernel2->kernel[y][x] = PS_SQR(kernel->kernel[y][x]); 195 204 } 196 205 } … … 332 341 } 333 342 343 float covarianceSum(const psKernel *covar) 344 { 345 if (!covar) { 346 return 1.0; 347 } 348 double sum = 0.0; 349 for (int y = covar->yMin; y <= covar->yMax; y++) { 350 for (int x = covar->xMin; x <= covar->xMax; x++) { 351 sum += covar->kernel[y][x]; 352 } 353 } 354 return sum; 355 } 356 357 334 358 int main(int argc, char *argv[]) 335 359 { … … 383 407 } 384 408 385 fprintf(stderr, "Input image %d: S/N: %f Covar: %f Var: %f \n",409 fprintf(stderr, "Input image %d: S/N: %f Covar: %f Var: %f CovarSum: %f\n", 386 410 i, 387 411 signoise(inImage, inMask, inVariance, inCovar), 388 412 psImageCovarianceFactor(inCovar), 389 meanVar(inVariance, inMask, inCovar)); 413 meanVar(inVariance, inMask, inCovar), 414 covarianceSum(inCovar)); 390 415 391 416 phot(inImage, inMask, inVariance, inCovar); … … 417 442 } 418 443 419 fprintf(stderr, "Warp image %d: S/N: %f Covar: %f Var: %f \n",444 fprintf(stderr, "Warp image %d: S/N: %f Covar: %f Var: %f CovarSum: %f\n", 420 445 i, 421 446 signoise(warpImage, warpMask, warpVariance, warpCovar), 422 447 psImageCovarianceFactor(warpCovar), 423 meanVar(warpVariance, warpMask, warpCovar)); 448 meanVar(warpVariance, warpMask, warpCovar), 449 covarianceSum(warpCovar)); 424 450 425 451 phot(warpImage, warpMask, warpVariance, warpCovar); … … 434 460 pmReadoutReadSubtractionKernels(ro, fits); 435 461 pmSubtractionKernels *kernels = psMetadataLookupPtr(NULL, ro->analysis, PM_SUBTRACTION_ANALYSIS_KERNEL); 462 int normIndex = PM_SUBTRACTION_INDEX_NORM(kernels); 463 int bgIndex = PM_SUBTRACTION_INDEX_BG(kernels); 464 #if 1 465 // kernels->solution1->data.F64[normIndex] += 1.0; 466 kernels->solution1->data.F64[bgIndex] = 0.0; 467 #endif 468 fprintf(stderr, "Norm: %f BG: %f\n", kernels->solution1->data.F64[normIndex], kernels->solution1->data.F64[bgIndex]); 436 469 #if 0 437 470 for (int i = 0; i < kernels->num; i++) { … … 455 488 psFitsClose(fits); 456 489 490 #if 0 491 { 492 psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS); 493 psArray *covariances = psArrayAlloc(CONV_NUM); 494 psVector *factors = psVectorAlloc(CONV_NUM, PS_TYPE_F32); 495 double mean = 0.0; 496 for (int i = 0; i < CONV_NUM; i++) { 497 float x, y; 498 p_pmSubtractionPolynomialNormCoords(&x, &y, psRandomUniform(rng) * SKY_SIZE, 499 psRandomUniform(rng) * SKY_SIZE, 500 kernels->xMin, kernels->xMax, 501 kernels->yMin, kernels->yMax); 502 psKernel *kernel = pmSubtractionKernel(kernels, x, y, false); 503 psKernel *covar = covariances->data[i] = psImageCovarianceCalculate(kernel, inCovar); 504 psFree(kernel); 505 mean += factors->data.F32[i] = psImageCovarianceFactor(covar); 506 } 507 psFree(rng); 508 psFree(covariances); 509 510 mean /= WARP_NUM; 511 512 double stdev = 0.0; 513 for (int i = 0; i < CONV_NUM; i++) { 514 stdev += PS_SQR(factors->data.F32[i] - mean); 515 } 516 stdev = sqrt(stdev/(CONV_NUM-1)); 517 fprintf(stderr, "Conv covariance mean: %f stdev: %f\n", mean, stdev); 518 psFree(factors); 519 } 520 #endif 521 457 522 pmReadout *conv = pmReadoutAlloc(NULL); 458 523 #if 1 … … 460 525 conv->mask = psImageAlloc(SKY_SIZE, SKY_SIZE, PS_TYPE_IMAGE_MASK); 461 526 conv->variance = psImageAlloc(SKY_SIZE, SKY_SIZE, PS_TYPE_F32); 462 if (!pmSubtractionMatchPrecalc(NULL, conv, NULL, ro, ro->analysis, 32, 0.0, 0.01,527 if (!pmSubtractionMatchPrecalc(NULL, conv, NULL, ro, ro->analysis, 2 * kernels->size + 1, 0.0, 0.01, 463 528 0xFF, 0xF0, 0x0F, 0.1, 1.0)) { 464 529 psErrorStackPrint(stderr, "Error:"); … … 494 559 } 495 560 496 fprintf(stderr, "Conv Image %d: S/N: %f Covar: %f Var: %f \n",561 fprintf(stderr, "Conv Image %d: S/N: %f Covar: %f Var: %f CovarSum: %f\n", 497 562 i, 498 563 signoise(conv->image, conv->mask, conv->variance, conv->covariance), 499 564 psImageCovarianceFactor(conv->covariance), 500 meanVar(conv->variance, conv->mask, conv->covariance)); 565 meanVar(conv->variance, conv->mask, conv->covariance), 566 covarianceSum(conv->covariance)); 501 567 502 568 phot(conv->image, conv->mask, conv->variance, conv->covariance); 503 569 readouts->data[i] = conv; 504 570 571 // exit(1); 505 572 } 506 573 … … 624 691 meanVar(diffVariance, diffMask, diffCovar)); 625 692 626 phot(diffImage, diffMask, diffVariance, diffCovar);627 628 693 writeImage(diffImage, "ssdiff.image.fits"); 629 694 writeImage(diffMask, "ssdiff.mask.fits"); -
trunk/psLib/src/imageops/psImageCovariance.c
r28405 r28667 34 34 static float imageCovarianceCalculate(const psKernel *covar, // Original covariance matrix 35 35 const psKernel *kernel, // Convolution kernel 36 int x, int y // Coordinates in output covariance matrix 36 int x, int y, // Coordinates in output covariance matrix 37 float scale // Scale to apply 37 38 ) 38 39 { … … 83 84 } 84 85 85 return s um;86 return scale * sum; 86 87 } 87 88 … … 91 92 PS_ASSERT_THREAD_JOB_NON_NULL(job, false); 92 93 psAssert(job->args, "No job arguments"); 93 psAssert(job->args->n == 5, "Wrong number of job arguments: %ld", job->args->n);94 psAssert(job->args->n == 6, "Wrong number of job arguments: %ld", job->args->n); 94 95 95 96 psKernel *out = job->args->data[0]; // Output covariance matrix … … 98 99 int x = PS_SCALAR_VALUE(job->args->data[3], S32); // x coordinate in output covariance matrix 99 100 int y = PS_SCALAR_VALUE(job->args->data[4], S32); // y coordinate in output covariance matrix 100 101 out->kernel[y][x] = imageCovarianceCalculate(covar, kernel, x, y); 101 float scale = PS_SCALAR_VALUE(job->args->data[5], F32); // Scaling to apply 102 103 out->kernel[y][x] = imageCovarianceCalculate(covar, kernel, x, y, scale); 102 104 103 105 return true; … … 127 129 128 130 // Check for non-finite elements 131 double sumKernel = 0.0, sumKernel2 = 0.0; // Sum of the kernel 129 132 for (int y = kernel->yMin; y <= kernel->yMax; y++) { 130 133 for (int x = kernel->xMin; x <= kernel->xMax; x++) { … … 135 138 return NULL; 136 139 } 140 sumKernel += kernel->kernel[y][x]; 141 sumKernel2 += PS_SQR(kernel->kernel[y][x]); 137 142 } 138 143 } … … 155 160 int yMin = kernel->yMin - kernel->yMax + covar->yMin, yMax = kernel->yMax - kernel->yMin + covar->yMax; 156 161 psKernel *out = psKernelAlloc(xMin, xMax, yMin, yMax); // Covariance matrix for output 162 float scale = 1.0 / sumKernel2; // Scaling to apply 157 163 158 164 for (int y = yMin; y <= yMax; y++) { … … 165 171 PS_ARRAY_ADD_SCALAR(job->args, x, PS_TYPE_S32); 166 172 PS_ARRAY_ADD_SCALAR(job->args, y, PS_TYPE_S32); 173 PS_ARRAY_ADD_SCALAR(job->args, scale, PS_TYPE_F32); 167 174 if (!psThreadJobAddPending(job)) { 168 175 psFree(covar); … … 170 177 } 171 178 } else { 172 out->kernel[y][x] = imageCovarianceCalculate(covar, kernel, x, y); 173 } 174 } 175 } 176 psFree(covar); 179 out->kernel[y][x] = imageCovarianceCalculate(covar, kernel, x, y, scale); 180 } 181 } 182 } 177 183 178 184 if (threaded && !psThreadPoolWait(true)) { … … 180 186 return false; 181 187 } 188 189 psFree(covar); 182 190 183 191 return out; … … 194 202 195 203 // Check for non-finite elements 204 double sumKernel2 = 0.0; // Sum of the squared kernel 196 205 for (int y = kernel->yMin; y <= kernel->yMax; y++) { 197 206 for (int x = kernel->xMin; x <= kernel->xMax; x++) { … … 202 211 return NAN; 203 212 } 213 sumKernel2 += PS_SQR(kernel->kernel[y][x]); 204 214 } 205 215 } … … 215 225 } 216 226 217 float factor = imageCovarianceCalculate(covar, kernel, 0, 0); // Covariance factor 227 float scale = 1.0 / sumKernel2; // Scale to apply 228 float factor = imageCovarianceCalculate(covar, kernel, 0, 0, scale); // Covariance factor 218 229 psFree(covar); 219 230 return factor; … … 338 349 } 339 350 } 340 psFree(covar);341 342 351 if (threaded && !psThreadPoolWait(true)) { 343 352 psError(PS_ERR_UNKNOWN, false, "Error waiting for threads."); 344 353 return false; 345 354 } 355 psFree(covar); 346 356 347 357 return out; … … 616 626 if (set && !threaded) { 617 627 { 618 psThreadTask *task = psThreadTaskAlloc("PSLIB_IMAGE_COVARIANCE_CALCULATE", 5);628 psThreadTask *task = psThreadTaskAlloc("PSLIB_IMAGE_COVARIANCE_CALCULATE", 6); 619 629 task->function = &imageCovarianceCalculateThread; 620 630 psThreadTaskAdd(task); -
trunk/psLib/src/imageops/psImageInterpolate.c
r26892 r28667 427 427 428 428 // Determine the result of the interpolation after all the math has been done 429 #define INTERPOLATE_RESULT() \ 430 psImageInterpolateStatus status = PS_INTERPOLATE_STATUS_ERROR; /* Status of interpolation */ \ 431 *imageValue = sumKernel > 0 ? sumImage / sumKernel : interp->badImage; \ 432 if (wantVariance) { \ 433 *varianceValue = sumVariance / (sumKernel2 - sumBad); \ 434 } \ 435 if (sumKernel == 0.0) { \ 436 /* No kernel contributions */ \ 437 if (haveMask && maskValue) { \ 438 *maskValue |= interp->badMask; \ 439 } \ 440 status = PS_INTERPOLATE_STATUS_BAD; \ 441 } else if (sumBad == 0) { \ 442 /* Completely good pixel */ \ 443 status = PS_INTERPOLATE_STATUS_GOOD; \ 444 } else if (sumBad < PS_SQR(interp->poorFrac) * sumKernel2) { \ 445 /* Some pixels masked: poor pixel */ \ 446 if (haveMask && maskValue) { \ 447 *maskValue |= interp->poorMask; \ 448 } \ 449 status = PS_INTERPOLATE_STATUS_POOR; \ 450 } else { \ 451 /* Many pixels (or a few important pixels) masked: bad pixel */ \ 452 if (haveMask && maskValue) { \ 453 *maskValue |= interp->badMask; \ 454 } \ 455 status = PS_INTERPOLATE_STATUS_BAD; \ 456 } 429 static psImageInterpolateStatus interpolateResult(const psImageInterpolation *interp, 430 double *imageValue, double *varianceValue, 431 psImageMaskType *maskValue, 432 double sumImage, double sumVariance, double sumBad, 433 double sumKernel, double sumKernel2, 434 bool wantVariance, bool haveMask) 435 { 436 *imageValue = sumKernel > 0 ? sumImage / sumKernel : interp->badImage; 437 if (wantVariance) { 438 if (sumBad > 0) { 439 sumVariance *= sumKernel2 / (sumKernel2 - sumBad); 440 } 441 *varianceValue = sumVariance / PS_SQR(sumKernel); 442 } 443 if (sumKernel == 0.0) { 444 // No kernel contributions at all 445 if (haveMask && maskValue) { 446 *maskValue |= interp->badMask; 447 } 448 return PS_INTERPOLATE_STATUS_BAD; 449 } 450 if (sumBad == 0) { 451 // Completely good pixel 452 return PS_INTERPOLATE_STATUS_GOOD; 453 } 454 if (sumBad < PS_SQR(interp->poorFrac) * sumKernel2) { 455 // Some pixels masked: poor pixel 456 if (haveMask && maskValue) { 457 *maskValue |= interp->poorMask; 458 } 459 return PS_INTERPOLATE_STATUS_POOR; 460 } 461 // Many pixels (or a few important pixels) masked: bad pixel 462 if (haveMask && maskValue) { 463 *maskValue |= interp->badMask; 464 } 465 return PS_INTERPOLATE_STATUS_BAD; 466 } 457 467 458 468 // Interpolation engine for separable interpolation kernels … … 703 713 } 704 714 705 INTERPOLATE_RESULT();706 707 715 psFree(xKernelNew); 708 716 psFree(yKernelNew); … … 710 718 psFree(yKernel2New); 711 719 712 return status; 720 return interpolateResult(interp, imageValue, varianceValue, maskValue, sumImage, sumVariance, sumBad, 721 sumKernel, sumKernel2, wantVariance, haveMask); 713 722 } 714 723 … … 861 870 } 862 871 863 INTERPOLATE_RESULT(); 864 865 return status; 872 return interpolateResult(interp, imageValue, varianceValue, maskValue, sumImage, sumVariance, sumBad, 873 sumKernel, sumKernel2, wantVariance, haveMask); 866 874 } 867 875 -
trunk/psModules/src/imcombine/pmSubtraction.c
r28405 r28667 52 52 53 53 // Take the square of the normal kernel 54 double sumVariance = 0.0; // Sum of the variance kernels55 54 for (int v = yMin; v <= yMax; v++) { 56 55 for (int u = xMin; u <= xMax; u++) { 57 sumVariance += out->kernel[v][u] = PS_SQR(normalKernel->kernel[v][u]); 58 } 59 } 60 61 // Normalise so that the sum of the variance kernel is the square of the sum of the normal kernel 62 // This is required to keep the relative scaling between the image and the variance map 63 psBinaryOp(out->image, out->image, "*", psScalarAlloc(1.0 / sumVariance, PS_TYPE_F32)); 64 56 out->kernel[v][u] = PS_SQR(normalKernel->kernel[v][u]); 57 } 58 } 65 59 return out; 66 60 } … … 271 265 // Convolve an image using FFT 272 266 static void convolveVarianceFFT(psImage *target,// Place the result in here 273 psImage *variance, // Variance map to convolve274 psImage *kernelErr, // Kernel error image275 psImage *mask, // Mask image276 psImageMaskType maskVal, // Value to mask277 const psKernel *kernel, // Kernel by which to convolve278 psRegion region,// Region of interest279 int size // Size of (square) kernel280 )267 psImage *variance, // Variance map to convolve 268 psImage *kernelErr, // Kernel error image 269 psImage *mask, // Mask image 270 psImageMaskType maskVal, // Value to mask 271 const psKernel *kernel, // Kernel by which to convolve 272 psRegion region,// Region of interest 273 int size // Size of (square) kernel 274 ) 281 275 { 282 276 psRegion border = psRegionSet(region.x0 - size, region.x1 + size, … … 348 342 psImage *image, // Image to convolve 349 343 psImage *variance, // Variance map to convolve, or NULL 344 const psKernel *covar, // Covariance, or NULL 350 345 psImage *kernelErr, // Kernel error image, or NULL 351 346 psImage *subMask, // Subtraction mask … … 393 388 if (variance) { 394 389 convolveDirect(convVariance, variance, *kernelVariance, region, 0.0, kernels->size); 390 } 391 } 392 393 if (variance && covar) { 394 // Apply covariance factor to variance map, to allow for spatial variation 395 float factor = psImageCovarianceCalculateFactor(*kernelImage, covar); // Factor to apply 396 for (int y = region.y0; y < region.y1; y++) { 397 for (int x = region.x0; x < region.x1; x++) { 398 convVariance->data.F32[y][x] *= factor; 399 } 395 400 } 396 401 } … … 1085 1090 if (kernels->mode == PM_SUBTRACTION_MODE_1 || kernels->mode == PM_SUBTRACTION_MODE_DUAL) { 1086 1091 convolveRegion(out1->image, out1->variance, out1->mask, &kernelImage, &kernelVariance, 1087 ro1->image, ro1->variance, kernelErr1, subMask, kernels, polyValues, background,1088 *region, maskBad, maskPoor, poorFrac, useFFT, false);1092 ro1->image, ro1->variance, ro1->covariance, kernelErr1, subMask, kernels, 1093 polyValues, background, *region, maskBad, maskPoor, poorFrac, useFFT, false); 1089 1094 } 1090 1095 if (kernels->mode == PM_SUBTRACTION_MODE_2 || kernels->mode == PM_SUBTRACTION_MODE_DUAL) { 1091 1096 convolveRegion(out2->image, out2->variance, out2->mask, &kernelImage, &kernelVariance, 1092 ro2->image, ro2->variance, kernelErr2, subMask, kernels, polyValues, background,1093 *region, maskBad, maskPoor, poorFrac, useFFT,1097 ro2->image, ro2->variance, ro2->covariance, kernelErr2, subMask, kernels, 1098 polyValues, background, *region, maskBad, maskPoor, poorFrac, useFFT, 1094 1099 kernels->mode == PM_SUBTRACTION_MODE_DUAL); 1095 1100 } … … 1325 1330 1326 1331 // Calculate covariances 1327 // This can be fairly involved, so we only do it for a single instance 1328 // Enable threads for covariance calculation, since we're not threading on top of it. 1332 // This can be fairly involved, so we only do it for a small number of instances 1329 1333 float position[NUM_COVAR_POS] = { -1.0, -0.5, 0.0, +0.5, +1.0 }; // Positions for covariance calculations 1334 // Enable threads for covariance calculation, since we're not threading on top of it 1330 1335 oldThreads = psImageCovarianceSetThreads(true); 1331 1336 if (kernels->mode == PM_SUBTRACTION_MODE_1 || kernels->mode == PM_SUBTRACTION_MODE_DUAL) { … … 1342 1347 out1->covariance = psImageCovarianceAverage(covars); 1343 1348 psFree(covars); 1349 // Remove covariance factor from covariance, since we've put it in the variance map already 1350 float factor = psImageCovarianceFactor(out1->covariance); 1351 psBinaryOp(out1->covariance->image, out1->covariance->image, "/", psScalarAlloc(factor, PS_TYPE_F32)); 1344 1352 } 1345 1353 if (kernels->mode == PM_SUBTRACTION_MODE_2 || kernels->mode == PM_SUBTRACTION_MODE_DUAL) { … … 1356 1364 out2->covariance = psImageCovarianceAverage(covars); 1357 1365 psFree(covars); 1366 // Remove covariance factor from covariance, since we've put it in the variance map already 1367 float factor = psImageCovarianceFactor(out2->covariance); 1368 psBinaryOp(out2->covariance->image, out2->covariance->image, "/", psScalarAlloc(factor, PS_TYPE_F32)); 1358 1369 } 1359 1370 psImageCovarianceSetThreads(oldThreads); -
trunk/psphot/src/psphotSignificanceImage.c
r26894 r28667 76 76 // Calculate correction factor for the covariance produced by the (potentially multiple) smoothing 77 77 psKernel *kernel = psImageSmoothKernel(SIGMA_SMTH, NSIGMA_SMTH); // Kernel used for smoothing 78 float factor = 1.0 / psImageCovarianceCalculateFactor(kernel, readout->covariance); 78 double sum2 = 0.0; // Sum of kernel squared 79 for (int y = kernel->yMin; y <= kernel->yMax; y++) { 80 for (int x = kernel->xMin; x <= kernel->xMax; x++) { 81 sum2 += PS_SQR(kernel->kernel[y][x]); 82 } 83 } 84 float factor = 1.0 / (sum2 * psImageCovarianceCalculateFactor(kernel, readout->covariance)); 79 85 psFree(kernel); 80 86
Note:
See TracChangeset
for help on using the changeset viewer.
