Changeset 26479
- Timestamp:
- Dec 23, 2009, 8:08:30 AM (16 years ago)
- Location:
- branches/eam_branches/20091201/psModules/src/imcombine
- Files:
-
- 2 added
- 3 edited
-
Makefile.am (modified) (2 diffs)
-
pmSubtractionDeconvolve.c (added)
-
pmSubtractionDeconvolve.h (added)
-
pmSubtractionKernels.c (modified) (1 diff)
-
pmSubtractionKernels.h (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/eam_branches/20091201/psModules/src/imcombine/Makefile.am
r26474 r26479 14 14 pmSubtractionKernels.c \ 15 15 pmSubtractionHermitian.c \ 16 pmSubtractionDeconvolve.c \ 16 17 pmSubtractionMask.c \ 17 18 pmSubtractionMatch.c \ … … 34 35 pmSubtractionKernels.h \ 35 36 pmSubtractionHermitian.h \ 37 pmSubtractionDeconvolve.h \ 36 38 pmSubtractionMask.h \ 37 39 pmSubtractionMatch.h \ -
branches/eam_branches/20091201/psModules/src/imcombine/pmSubtractionKernels.c
r26473 r26479 346 346 return kernels; 347 347 } 348 349 # if (0) 350 pmSubtractionKernels *pmSubtractionKernelsDECON_HERM(int size, int spatialOrder, 351 const psVector *fwhmsIN, const psVector *ordersIN, 352 float penalty, pmSubtractionMode mode) 353 { 354 PS_ASSERT_VECTOR_NON_NULL(fwhmsIN, NULL); 355 PS_ASSERT_VECTOR_TYPE(fwhmsIN, PS_TYPE_F32, NULL); 356 PS_ASSERT_VECTOR_NON_NULL(ordersIN, NULL); 357 PS_ASSERT_VECTOR_TYPE(ordersIN, PS_TYPE_S32, NULL); 358 PS_ASSERT_VECTORS_SIZE_EQUAL(fwhmsIN, ordersIN, NULL); 359 PS_ASSERT_INT_POSITIVE(size, NULL); 360 PS_ASSERT_INT_NONNEGATIVE(spatialOrder, NULL); 361 362 // check the requested fwhm values: any values <= 0.0 should be dropped 363 psVector *fwhms = psVectorAllocEmpty (fwhmsIN->n, PS_TYPE_F32); 364 psVector *orders = psVectorAllocEmpty (ordersIN->n, PS_TYPE_S32); 365 for (int i = 0; i < fwhmsIN->n; i++) { 366 if (fwhmsIN->data.F32[i] <= FLT_EPSILON) continue; 367 psVectorAppend(fwhms, fwhmsIN->data.F32[i]); 368 psVectorAppend(orders, ordersIN->data.S32[i]); 369 } 370 371 int numGaussians = fwhms->n; // Number of Gaussians 372 373 int num = 0; // Number of basis functions 374 psString params = NULL; // List of parameters 375 for (int i = 0; i < numGaussians; i++) { 376 int gaussOrder = orders->data.S32[i]; // Polynomial order to apply to Gaussian 377 psStringAppend(¶ms, "(%.1f,%d)", fwhms->data.F32[i], orders->data.S32[i]); 378 num += (gaussOrder + 1) * (gaussOrder + 2) / 2; 379 } 380 381 pmSubtractionKernels *kernels = pmSubtractionKernelsAlloc(num, PM_SUBTRACTION_KERNEL_DECON_HERM, size, spatialOrder, penalty, mode); // The kernels 382 psStringAppend(&kernels->description, "DECON_HERM(%d,%s,%d,%.2e)", size, params, spatialOrder, penalty); 383 384 psLogMsg("psModules.imcombine", PS_LOG_INFO, "DECONVOLVED HERM kernel: %s,%d --> %d elements", params, spatialOrder, num); 385 psFree(params); 386 387 // XXXXX hard-wired reference sigma for now of 1.7 pix 388 // generate the Gaussian deconvolution kernel 389 # define DECON_SIGMA 1.7 390 psKernel *kernelGauss = pmSubtractionDeconvolveGauss (size, DECON_SIGMA); 391 392 // Set the kernel parameters 393 int fullSize = 2 * size + 1; // Full size of kernels 394 for (int i = 0, index = 0; i < numGaussians; i++) { 395 float sigma = fwhms->data.F32[i] / (2.0 * sqrtf(2.0 * logf(2.0))); // Gaussian sigma 396 // Iterate over (u,v) order 397 for (int uOrder = 0; uOrder <= orders->data.S32[i]; uOrder++) { 398 for (int vOrder = 0; vOrder <= orders->data.S32[i] - uOrder; vOrder++, index++) { 399 psArray *preCalc = psArrayAlloc(3); // Array to hold precalculated values 400 psVector *xKernel = preCalc->data[0] = subtractionKernelHERM(sigma, uOrder, size); // x Kernel 401 psVector *yKernel = preCalc->data[1] = subtractionKernelHERM(sigma, vOrder, size); // y Kernel 402 psKernel *kernelTarget = psKernelAlloc(-size, size, -size, size); // Kernel 403 404 // generate 2D kernel, calculate moments 405 for (int v = -size, y = 0; v <= size; v++, y++) { 406 for (int u = -size, x = 0; u <= size; u++, x++) { 407 double value = xKernel->data.F32[x] * yKernel->data.F32[y]; // Value of kernel 408 kernelTarget->kernel[v][u] = value; 409 } 410 } 411 412 // deconvolve the target by the gaussian: 413 psKernel *kernel = pmSubtractionDeconvolveKernel(kernelTarget, kernelGauss); // Kernel 414 preCalc->data[2] = kernel; 415 416 psImage *kernelConv = psImageConvolveFFT(NULL, kernel, NULL, 0, kernelGauss); 417 pmSubtractionVisualShowSubtraction (kernelTarget->image, kernel->image, kernelConv->image); 418 419 // Normalise sum of kernel component to unity for even functions 420 if (uOrder % 2 == 0 && vOrder % 2 == 0) { 421 double sum = 0.0; // Sum of kernel component 422 for (int v = 0; v < fullSize; v++) { 423 for (int u = 0; u < fullSize; u++) { 424 sum += xKernel->data.F32[u] * yKernel->data.F32[v]; 425 } 426 } 427 sum = 1.0 / sqrt(sum); 428 psBinaryOp(xKernel, xKernel, "*", psScalarAlloc(sum, PS_TYPE_F32)); 429 psBinaryOp(yKernel, yKernel, "*", psScalarAlloc(sum, PS_TYPE_F32)); 430 psBinaryOp(kernel->image, kernel->image, "*", psScalarAlloc(PS_SQR(sum), PS_TYPE_F32)); 431 432 #if 1 433 fprintf(stderr, "%d norm: %e, null: %e\n", index, sum, kernel->kernel[0][0]); 434 #endif 435 436 kernel->kernel[0][0] -= 1.0; 437 moment *= PS_SQR(sum); 438 } 439 440 441 #if 1 442 double sum = 0.0; // Sum of kernel component 443 for (int v = -size; v <= size; v++) { 444 for (int u = -size; u <= size; u++) { 445 sum += kernel->kernel[v][u]; 446 } 447 } 448 fprintf(stderr, "%d sum: %e\n", index, sum); 449 #endif 450 451 kernels->widths->data.F32[index] = fwhms->data.F32[i]; 452 kernels->u->data.S32[index] = uOrder; 453 kernels->v->data.S32[index] = vOrder; 454 if (kernels->preCalc->data[index]) { 455 psFree(kernels->preCalc->data[index]); 456 } 457 kernels->preCalc->data[index] = preCalc; 458 kernels->penalties->data.F32[index] = kernels->penalty * fabsf(moment); 459 460 psTrace("psModules.imcombine", 7, "Kernel %d: %f %d %d %f\n", index, 461 fwhms->data.F32[i], uOrder, vOrder, fabsf(moment)); 462 } 463 } 464 } 465 466 return kernels; 467 } 468 # endif 348 469 349 470 ////////////////////////////////////////////////////////////////////////////////////////////////////////////// -
branches/eam_branches/20091201/psModules/src/imcombine/pmSubtractionKernels.h
r26473 r26479 11 11 PM_SUBTRACTION_KERNEL_ISIS, ///< Traditional kernel --- gaussians modified by polynomials 12 12 PM_SUBTRACTION_KERNEL_HERM, ///< Hermitian polynomial kernels 13 PM_SUBTRACTION_KERNEL_DECON_HERM, ///< Deconvolved Hermitian polynomial kernels 13 14 PM_SUBTRACTION_KERNEL_SPAM, ///< Summed Pixels for Advanced Matching --- summed delta functions 14 15 PM_SUBTRACTION_KERNEL_FRIES, ///< Fibonacci Radius Increases Excellence of Subtraction … … 31 32 psString description; ///< Description of the kernel parameters 32 33 long num; ///< Number of kernel components (not including the spatial ones) 33 psVector *u, *v; ///< Offset (for POIS) or polynomial order (for ISIS orHERM)34 psVector *widths; ///< Gaussian FWHMs (ISIS orHERM)34 psVector *u, *v; ///< Offset (for POIS) or polynomial order (for ISIS, HERM or DECON_HERM) 35 psVector *widths; ///< Gaussian FWHMs (ISIS, HERM or DECON_HERM) 35 36 psVector *uStop, *vStop; ///< Width of kernel element (SPAM,FRIES only) 36 psArray *preCalc; ///< Array of images containing pre-calculated kernel (for ISIS orHERM)37 psArray *preCalc; ///< Array of images containing pre-calculated kernel (for ISIS, HERM or DECON_HERM) 37 38 float penalty; ///< Penalty for wideness 38 39 psVector *penalties; ///< Penalty for each kernel component … … 70 71 PS_ASSERT_VECTOR_SIZE((KERNELS)->widths, (KERNELS)->num, RETURNVALUE); \ 71 72 } \ 73 if ((KERNELS)->type == PM_SUBTRACTION_KERNEL_DECON_HERM) { \ 74 PS_ASSERT_VECTOR_NON_NULL((KERNELS)->widths, RETURNVALUE); \ 75 PS_ASSERT_VECTOR_TYPE((KERNELS)->widths, PS_TYPE_F32, RETURNVALUE); \ 76 PS_ASSERT_VECTOR_SIZE((KERNELS)->widths, (KERNELS)->num, RETURNVALUE); \ 77 } \ 72 78 if ((KERNELS)->uStop || (KERNELS)->vStop) { \ 73 79 PS_ASSERT_VECTOR_NON_NULL((KERNELS)->uStop, RETURNVALUE); \ … … 157 163 ); 158 164 165 /// Generate DECON_HERM kernels 166 pmSubtractionKernels *pmSubtractionKernelsDECON_HERM(int size, ///< Half-size of the kernel 167 int spatialOrder, ///< Order of spatial variations 168 const psVector *fwhms, ///< Gaussian FWHMs 169 const psVector *orders, ///< order of hermitian polynomials 170 float penalty, ///< Penalty for wideness 171 pmSubtractionMode mode ///< Mode for subtraction 172 ); 173 159 174 /// Generate SPAM kernels 160 175 pmSubtractionKernels *pmSubtractionKernelsSPAM(int size, ///< Half-size of the kernel
Note:
See TracChangeset
for help on using the changeset viewer.
