Changeset 26587
- Timestamp:
- Jan 13, 2010, 4:06:30 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/eam_branches/20091201/psModules/src/imcombine/pmSubtractionKernels.c
r26574 r26587 90 90 91 91 for (int i = 0, x = -size; x <= size; i++, x++) { 92 float xf = x / sigma;93 float z = -0.25*xf*xf;92 float xf = x / sigma; 93 float z = -0.25*xf*xf; 94 94 kernel->data.F32[i] = norm * p_pmSubtractionHermitianPolynomial(xf, order) * exp(z); 95 95 } … … 100 100 // Generate 1D convolution kernel for HERM (normalized for 2D) 101 101 psKernel *pmSubtractionKernelHERM_RADIAL(float sigma, // Gaussian width 102 int order, // Polynomial order103 int size // Kernel half-size102 int order, // Polynomial order 103 int size // Kernel half-size 104 104 ) 105 105 { … … 112 112 // generate 2D radial hermitian 113 113 for (int v = -size; v <= size; v++) { 114 for (int u = -size; u <= size; u++) {115 float r = hypot(u, v) / sigma;116 float z = -0.25*r*r;117 kernel->kernel[v][u] = norm * p_pmSubtractionHermitianPolynomial(r, order) * exp(z);118 }114 for (int u = -size; u <= size; u++) { 115 float r = hypot(u, v) / sigma; 116 float z = -0.25*r*r; 117 kernel->kernel[v][u] = norm * p_pmSubtractionHermitianPolynomial(r, order) * exp(z); 118 } 119 119 } 120 120 … … 156 156 kernels->preCalc->data[index] = NULL; 157 157 kernels->penalties->data.F32[index] = kernels->penalty * PS_SQR(PS_SQR(u) + PS_SQR(v)); 158 psAssert (isfinite(kernels->penalties->data.F32[index]), "invalid penalty");158 psAssert (isfinite(kernels->penalties->data.F32[index]), "invalid penalty"); 159 159 psTrace("psModules.imcombine", 7, "Kernel %d: %d %d\n", index, u, v); 160 160 } … … 170 170 } 171 171 172 bool pmSubtractionKernelPreCalcNormalize (pmSubtractionKernels *kernels, pmSubtractionKernelPreCalc *preCalc, int index, int size, int uOrder, int vOrder, float fwhm, bool AlardLuptonStyle, bool forceZeroNull) { 173 174 // Calculate moments 175 double moment = 0.0; // Moment, for penalty 176 for (int v = -size; v <= size; v++) { 177 for (int u = -size; u <= size; u++) { 178 double value = preCalc->kernel->kernel[v][u]; 179 moment += PS_SQR(value) * PS_SQR((PS_SQR(u) + PS_SQR(v))); 180 } 181 } 182 172 bool pmSubtractionKernelPreCalcNormalize(pmSubtractionKernels *kernels, pmSubtractionKernelPreCalc *preCalc, 173 int index, int size, int uOrder, int vOrder, float fwhm, 174 bool AlardLuptonStyle, bool forceZeroNull) 175 { 183 176 // we have 4 cases here: 184 177 // 1) for odd functions, normalize the kernel by the maximum swing / Npix … … 187 180 // 4) for deconvolved hermitians, subtract 1 from the 0,0 pixel for the 0,0 function(s) 188 181 189 double sum = 0.0; // Sum of kernel component190 double min = FLT_MAX;191 double max = FLT_MIN;192 182 // Calculate moments 183 double penalty = 0.0; // Moment, for penalty 184 double sum = 0.0, sum2 = 0.0; // Sum of kernel component 185 float min = INFINITY, max = -INFINITY; // Minimum and maximum kernel value 193 186 for (int v = -size; v <= size; v++) { 194 for (int u = -size; u <= size; u++) { 195 sum += preCalc->kernel->kernel[v][u]; 196 min = PS_MIN(preCalc->kernel->kernel[v][u], min); 197 max = PS_MAX(preCalc->kernel->kernel[v][u], max); 198 } 199 } 187 for (int u = -size; u <= size; u++) { 188 double value = preCalc->kernel->kernel[v][u]; 189 double value2 = PS_SQR(value); 190 sum += value; 191 sum2 += value2; 192 penalty += value2 * PS_SQR((PS_SQR(u) + PS_SQR(v))); 193 min = PS_MIN(value, min); 194 max = PS_MAX(value, max); 195 } 196 } 197 200 198 #if 0 201 fprintf(stderr, "%d raw: %lf, null: %f, min: %lf, max: %lf, moment: %lf\n", index, sum, preCalc->kernel->kernel[0][0], min, max, moment);199 fprintf(stderr, "%d raw: %lf, null: %f, min: %lf, max: %lf, moment: %lf\n", index, sum, preCalc->kernel->kernel[0][0], min, max, penalty); 202 200 #endif 203 201 204 // only even terms have non-zero sums 205 if ((uOrder % 2 == 0) && (vOrder % 2 == 0)) { 206 moment /= PS_SQR(sum); 207 } else { 208 // XXX keep this? 209 moment = 0.0; 210 } 211 212 bool zeroNull = false; 213 float scale1D = 1.0 / sqrt(sum); 214 float scale2D = 1.0 / sum; 215 216 if (AlardLuptonStyle && (uOrder % 2 == 0 && vOrder % 2 == 0)) { 217 zeroNull = true; 218 } 202 bool zeroNull = false; // Zero out using the null position? 203 float scale2D = NAN; // Scaling for 2-D kernels 204 205 if (AlardLuptonStyle) { 206 if (uOrder % 2 == 0 && vOrder % 2 == 0) { 207 // Even functions: normalise to unit sum and subtract null pixel so that sum is zero 208 scale2D = 1.0 / fabs(sum); 209 zeroNull = true; 210 } else { 211 // Odd functions: choose normalisation so that parameters have about the same strength as for even 212 // functions, no subtraction of null pixel because the sum is already (near) zero 213 scale2D = 1.0 / max; 214 zeroNull = false; 215 } 216 } 217 219 218 if (!AlardLuptonStyle && (uOrder == 0 && vOrder == 0)) { 220 zeroNull = true;219 zeroNull = true; 221 220 } 222 221 if (forceZeroNull) { 223 zeroNull = true;222 zeroNull = true; 224 223 } 225 224 if (!forceZeroNull && ((uOrder % 2) || (vOrder % 2))) { 226 // scale2D = 1.0 / (preCalc->kernel->image->numCols * preCalc->kernel->image->numRows * max); 227 scale2D = 1.0 / max;228 scale1D = sqrt(scale2D); 229 } 230 231 if (preCalc->xKernel) { 232 psBinaryOp(preCalc->xKernel, preCalc->xKernel, "*", psScalarAlloc(scale1D, PS_TYPE_F32));225 // Odd function 226 scale2D = 1.0 / max; 227 } 228 229 float scale1D = sqrtf(scale2D); // Scaling for 1-D kernels 230 if (preCalc->xKernel) { 231 psBinaryOp(preCalc->xKernel, preCalc->xKernel, "*", psScalarAlloc(scale1D, PS_TYPE_F32)); 233 232 } 234 233 if (preCalc->yKernel) { 235 psBinaryOp(preCalc->yKernel, preCalc->yKernel, "*", psScalarAlloc(scale1D, PS_TYPE_F32)); 236 } 234 psBinaryOp(preCalc->yKernel, preCalc->yKernel, "*", psScalarAlloc(scale1D, PS_TYPE_F32)); 235 } 236 237 237 psBinaryOp(preCalc->kernel->image, preCalc->kernel->image, "*", psScalarAlloc(scale2D, PS_TYPE_F32)); 238 penalty *= PS_SQR(scale2D); 239 238 240 if (zeroNull) { 239 preCalc->kernel->kernel[0][0] -= 1.0;241 preCalc->kernel->kernel[0][0] -= 1.0; 240 242 } 241 243 … … 245 247 max = FLT_MIN; 246 248 for (int v = -size; v <= size; v++) { 247 for (int u = -size; u <= size; u++) {248 sum += preCalc->kernel->kernel[v][u];249 min = PS_MIN(preCalc->kernel->kernel[v][u], min);250 max = PS_MAX(preCalc->kernel->kernel[v][u], max);251 }249 for (int u = -size; u <= size; u++) { 250 sum += preCalc->kernel->kernel[v][u]; 251 min = PS_MIN(preCalc->kernel->kernel[v][u], min); 252 max = PS_MAX(preCalc->kernel->kernel[v][u], max); 253 } 252 254 } 253 255 fprintf(stderr, "%d mod: %lf, null: %f, min: %lf, max: %lf, scale: %f\n", index, sum, preCalc->kernel->kernel[0][0], min, max, scale2D); … … 258 260 kernels->v->data.S32[index] = vOrder; 259 261 if (kernels->preCalc->data[index]) { 260 psFree(kernels->preCalc->data[index]);262 psFree(kernels->preCalc->data[index]); 261 263 } 262 264 kernels->preCalc->data[index] = preCalc; 263 kernels->penalties->data.F32[index] = kernels->penalty * fabsf(moment);265 kernels->penalties->data.F32[index] = kernels->penalty * penalty; 264 266 psAssert (isfinite(kernels->penalties->data.F32[index]), "invalid penalty"); 265 psTrace("psModules.imcombine", 7, "Kernel %d: %f %d %d %f\n", index, fwhm, uOrder, vOrder, fabsf(moment));267 psTrace("psModules.imcombine", 7, "Kernel %d: %f %d %d %f\n", index, fwhm, uOrder, vOrder, penalty); 266 268 267 269 return true; … … 284 286 psVector *orders = psVectorAllocEmpty (ordersIN->n, PS_TYPE_S32); 285 287 for (int i = 0; i < fwhmsIN->n; i++) { 286 if (fwhmsIN->data.F32[i] <= FLT_EPSILON) continue;287 psVectorAppend(fwhms, fwhmsIN->data.F32[i]);288 psVectorAppend(orders, ordersIN->data.S32[i]);288 if (fwhmsIN->data.F32[i] <= FLT_EPSILON) continue; 289 psVectorAppend(fwhms, fwhmsIN->data.F32[i]); 290 psVectorAppend(orders, ordersIN->data.S32[i]); 289 291 } 290 292 … … 315 317 316 318 pmSubtractionKernelPreCalc *preCalc = pmSubtractionKernelPreCalcAlloc(PM_SUBTRACTION_KERNEL_ISIS, uOrder, vOrder, size, sigma); // structure to hold precalculated values 317 pmSubtractionKernelPreCalcNormalize (kernels, preCalc, index, size, uOrder, vOrder, fwhms->data.F32[i], true, false);318 // pmSubtractionKernelPreCalcNormalize (kernels, preCalc, index, size, uOrder, vOrder, fwhms->data.F32[i], false, false);319 pmSubtractionKernelPreCalcNormalize (kernels, preCalc, index, size, uOrder, vOrder, fwhms->data.F32[i], true, false); 320 // pmSubtractionKernelPreCalcNormalize (kernels, preCalc, index, size, uOrder, vOrder, fwhms->data.F32[i], false, false); 319 321 } 320 322 } … … 325 327 326 328 pmSubtractionKernels *pmSubtractionKernelsISIS_RADIAL(int size, int spatialOrder, 327 const psVector *fwhmsIN, const psVector *ordersIN,328 float penalty, pmSubtractionMode mode)329 const psVector *fwhmsIN, const psVector *ordersIN, 330 float penalty, pmSubtractionMode mode) 329 331 { 330 332 PS_ASSERT_VECTOR_NON_NULL(fwhmsIN, NULL); … … 340 342 psVector *orders = psVectorAllocEmpty (ordersIN->n, PS_TYPE_S32); 341 343 for (int i = 0; i < fwhmsIN->n; i++) { 342 if (fwhmsIN->data.F32[i] <= FLT_EPSILON) continue;343 psVectorAppend(fwhms, fwhmsIN->data.F32[i]);344 psVectorAppend(orders, ordersIN->data.S32[i]);344 if (fwhmsIN->data.F32[i] <= FLT_EPSILON) continue; 345 psVectorAppend(fwhms, fwhmsIN->data.F32[i]); 346 psVectorAppend(orders, ordersIN->data.S32[i]); 345 347 } 346 348 … … 353 355 psStringAppend(¶ms, "(%.1f,%d)", fwhms->data.F32[i], orders->data.S32[i]); 354 356 num += (gaussOrder + 1) * (gaussOrder + 2) / 2; 355 num += (11 - gaussOrder - 1);// include all higher order radial terms357 num += (11 - gaussOrder - 1); // include all higher order radial terms 356 358 } 357 359 … … 369 371 for (int vOrder = 0; vOrder <= orders->data.S32[i] - uOrder; vOrder++, index++) { 370 372 pmSubtractionKernelPreCalc *preCalc = pmSubtractionKernelPreCalcAlloc(PM_SUBTRACTION_KERNEL_ISIS, uOrder, vOrder, size, sigma); // structure to hold precalculated values 371 pmSubtractionKernelPreCalcNormalize (kernels, preCalc, index, size, uOrder, vOrder, fwhms->data.F32[i], true, false);373 pmSubtractionKernelPreCalcNormalize (kernels, preCalc, index, size, uOrder, vOrder, fwhms->data.F32[i], true, false); 372 374 } 373 375 } 374 for (int order = orders->data.S32[i] + 1; order < 11; order ++, index ++) {375 // XXX modify size for hermitians to account for sqrt(2) in Hermitian definition (relative to ISIS Gaussian)376 pmSubtractionKernelPreCalc *preCalc = pmSubtractionKernelPreCalcAlloc(PM_SUBTRACTION_KERNEL_ISIS_RADIAL, order, order, size, sigma / sqrt(2.0)); // structure to hold precalculated values377 pmSubtractionKernelPreCalcNormalize (kernels, preCalc, index, size, order, order, fwhms->data.F32[i], true, true);378 }376 for (int order = orders->data.S32[i] + 1; order < 11; order ++, index ++) { 377 // XXX modify size for hermitians to account for sqrt(2) in Hermitian definition (relative to ISIS Gaussian) 378 pmSubtractionKernelPreCalc *preCalc = pmSubtractionKernelPreCalcAlloc(PM_SUBTRACTION_KERNEL_ISIS_RADIAL, order, order, size, sigma / sqrt(2.0)); // structure to hold precalculated values 379 pmSubtractionKernelPreCalcNormalize (kernels, preCalc, index, size, order, order, fwhms->data.F32[i], true, true); 380 } 379 381 } 380 382 return kernels; … … 382 384 383 385 pmSubtractionKernels *pmSubtractionKernelsHERM(int size, int spatialOrder, 384 const psVector *fwhmsIN, const psVector *ordersIN,385 float penalty, pmSubtractionMode mode)386 const psVector *fwhmsIN, const psVector *ordersIN, 387 float penalty, pmSubtractionMode mode) 386 388 { 387 389 PS_ASSERT_VECTOR_NON_NULL(fwhmsIN, NULL); … … 397 399 psVector *orders = psVectorAllocEmpty (ordersIN->n, PS_TYPE_S32); 398 400 for (int i = 0; i < fwhmsIN->n; i++) { 399 if (fwhmsIN->data.F32[i] <= FLT_EPSILON) continue;400 psVectorAppend(fwhms, fwhmsIN->data.F32[i]);401 psVectorAppend(orders, ordersIN->data.S32[i]);401 if (fwhmsIN->data.F32[i] <= FLT_EPSILON) continue; 402 psVectorAppend(fwhms, fwhmsIN->data.F32[i]); 403 psVectorAppend(orders, ordersIN->data.S32[i]); 402 404 } 403 405 … … 425 427 for (int vOrder = 0; vOrder <= orders->data.S32[i] - uOrder; vOrder++, index++) { 426 428 pmSubtractionKernelPreCalc *preCalc = pmSubtractionKernelPreCalcAlloc(PM_SUBTRACTION_KERNEL_HERM, uOrder, vOrder, size, sigma); // structure to hold precalculated values 427 pmSubtractionKernelPreCalcNormalize (kernels, preCalc, index, size, uOrder, vOrder, fwhms->data.F32[i], true, false);429 pmSubtractionKernelPreCalcNormalize (kernels, preCalc, index, size, uOrder, vOrder, fwhms->data.F32[i], true, false); 428 430 } 429 431 } … … 434 436 435 437 pmSubtractionKernels *pmSubtractionKernelsDECONV_HERM(int size, int spatialOrder, 436 const psVector *fwhmsIN, const psVector *ordersIN,437 float penalty, pmSubtractionMode mode)438 const psVector *fwhmsIN, const psVector *ordersIN, 439 float penalty, pmSubtractionMode mode) 438 440 { 439 441 PS_ASSERT_VECTOR_NON_NULL(fwhmsIN, NULL); … … 449 451 psVector *orders = psVectorAllocEmpty (ordersIN->n, PS_TYPE_S32); 450 452 for (int i = 0; i < fwhmsIN->n; i++) { 451 if (fwhmsIN->data.F32[i] <= FLT_EPSILON) continue;452 psVectorAppend(fwhms, fwhmsIN->data.F32[i]);453 psVectorAppend(orders, ordersIN->data.S32[i]);453 if (fwhmsIN->data.F32[i] <= FLT_EPSILON) continue; 454 psVectorAppend(fwhms, fwhmsIN->data.F32[i]); 455 psVectorAppend(orders, ordersIN->data.S32[i]); 454 456 } 455 457 … … 488 490 pmSubtractionKernelPreCalc *preCalc = pmSubtractionKernelPreCalcAlloc(PM_SUBTRACTION_KERNEL_HERM, uOrder, vOrder, size, sigma); // structure to hold precalculated values 489 491 490 // save the generated 2D kernel as the target, deconvolve it by Gaussian, replacing the generated 2D kernel491 psKernel *kernelTarget = preCalc->kernel;492 // save the generated 2D kernel as the target, deconvolve it by Gaussian, replacing the generated 2D kernel 493 psKernel *kernelTarget = preCalc->kernel; 492 494 preCalc->kernel = pmSubtractionDeconvolveKernel(kernelTarget, kernelGauss); // Kernel 493 495 494 // XXX do we use Alard-Lupton normalization (last param true) or not?495 pmSubtractionKernelPreCalcNormalize (kernels, preCalc, index, size, uOrder, vOrder, fwhms->data.F32[i], true, false);496 497 // XXXX test demo that deconvolved kernel is valid496 // XXX do we use Alard-Lupton normalization (last param true) or not? 497 pmSubtractionKernelPreCalcNormalize (kernels, preCalc, index, size, uOrder, vOrder, fwhms->data.F32[i], true, false); 498 499 // XXXX test demo that deconvolved kernel is valid 498 500 # if 1 499 psImage *kernelConv = psImageConvolveFFT(NULL, preCalc->kernel->image, NULL, 0, kernelGauss);500 psArrayAdd (deconKernels, 100, kernelConv);501 psFree (kernelConv);502 503 if (!uOrder && !vOrder){504 pmSubtractionVisualShowSubtraction (kernelTarget->image, preCalc->kernel->image, kernelConv);505 }501 psImage *kernelConv = psImageConvolveFFT(NULL, preCalc->kernel->image, NULL, 0, kernelGauss); 502 psArrayAdd (deconKernels, 100, kernelConv); 503 psFree (kernelConv); 504 505 if (!uOrder && !vOrder){ 506 pmSubtractionVisualShowSubtraction (kernelTarget->image, preCalc->kernel->image, kernelConv); 507 } 506 508 # endif 507 509 } … … 512 514 psImage *dot = psImageAlloc(deconKernels->n, deconKernels->n, PS_TYPE_F32); 513 515 for (int i = 0; i < deconKernels->n; i++) { 514 for (int j = 0; j <= i; j++) {515 psImage *t1 = deconKernels->data[i];516 psImage *t2 = deconKernels->data[j];517 518 double sum = 0.0;519 for (int iy = 0; iy < t1->numRows; iy++) {520 for (int ix = 0; ix < t1->numCols; ix++) {521 sum += t1->data.F32[iy][ix] * t2->data.F32[iy][ix];522 }523 }524 dot->data.F32[j][i] = sum;525 dot->data.F32[i][j] = sum;526 }516 for (int j = 0; j <= i; j++) { 517 psImage *t1 = deconKernels->data[i]; 518 psImage *t2 = deconKernels->data[j]; 519 520 double sum = 0.0; 521 for (int iy = 0; iy < t1->numRows; iy++) { 522 for (int ix = 0; ix < t1->numCols; ix++) { 523 sum += t1->data.F32[iy][ix] * t2->data.F32[iy][ix]; 524 } 525 } 526 dot->data.F32[j][i] = sum; 527 dot->data.F32[i][j] = sum; 528 } 527 529 } 528 530 pmSubtractionVisualShowSubtraction (dot, NULL, NULL); … … 587 589 switch (type) { 588 590 case PM_SUBTRACTION_KERNEL_ISIS: 589 preCalc->xKernel = pmSubtractionKernelISIS(sigma, uOrder, size);590 preCalc->yKernel = pmSubtractionKernelISIS(sigma, vOrder, size);591 preCalc->uCoords = NULL;592 preCalc->vCoords = NULL;593 preCalc->poly = NULL;594 break;591 preCalc->xKernel = pmSubtractionKernelISIS(sigma, uOrder, size); 592 preCalc->yKernel = pmSubtractionKernelISIS(sigma, vOrder, size); 593 preCalc->uCoords = NULL; 594 preCalc->vCoords = NULL; 595 preCalc->poly = NULL; 596 break; 595 597 case PM_SUBTRACTION_KERNEL_HERM: 596 preCalc->xKernel = pmSubtractionKernelHERM(sigma, uOrder, size);597 preCalc->yKernel = pmSubtractionKernelHERM(sigma, vOrder, size);598 preCalc->uCoords = NULL;599 preCalc->vCoords = NULL;600 preCalc->poly = NULL;601 break;598 preCalc->xKernel = pmSubtractionKernelHERM(sigma, uOrder, size); 599 preCalc->yKernel = pmSubtractionKernelHERM(sigma, vOrder, size); 600 preCalc->uCoords = NULL; 601 preCalc->vCoords = NULL; 602 preCalc->poly = NULL; 603 break; 602 604 case PM_SUBTRACTION_KERNEL_RINGS: 603 // the RINGS kernel uses the uCoords, vCoords, and poly elements of the structure604 // we allocate these vectors here, but leave the kernel generation to the main function605 preCalc->xKernel = NULL;606 preCalc->yKernel = NULL;607 preCalc->kernel = NULL;608 preCalc->uCoords = psVectorAllocEmpty(size, PS_TYPE_S32); // u coords609 preCalc->vCoords = psVectorAllocEmpty(size, PS_TYPE_S32); // v coords610 preCalc->poly = psVectorAllocEmpty(size, PS_TYPE_F32); // Polynomial611 return preCalc;605 // the RINGS kernel uses the uCoords, vCoords, and poly elements of the structure 606 // we allocate these vectors here, but leave the kernel generation to the main function 607 preCalc->xKernel = NULL; 608 preCalc->yKernel = NULL; 609 preCalc->kernel = NULL; 610 preCalc->uCoords = psVectorAllocEmpty(size, PS_TYPE_S32); // u coords 611 preCalc->vCoords = psVectorAllocEmpty(size, PS_TYPE_S32); // v coords 612 preCalc->poly = psVectorAllocEmpty(size, PS_TYPE_F32); // Polynomial 613 return preCalc; 612 614 case PM_SUBTRACTION_KERNEL_ISIS_RADIAL: 613 preCalc->kernel = pmSubtractionKernelHERM_RADIAL(sigma, uOrder, size);614 preCalc->xKernel = NULL;615 preCalc->yKernel = NULL;616 preCalc->uCoords = NULL;617 preCalc->vCoords = NULL;618 preCalc->poly = NULL;619 return preCalc;615 preCalc->kernel = pmSubtractionKernelHERM_RADIAL(sigma, uOrder, size); 616 preCalc->xKernel = NULL; 617 preCalc->yKernel = NULL; 618 preCalc->uCoords = NULL; 619 preCalc->vCoords = NULL; 620 preCalc->poly = NULL; 621 return preCalc; 620 622 default: 621 psAbort("programming error: invalid type for PreCalc kernel");623 psAbort("programming error: invalid type for PreCalc kernel"); 622 624 } 623 625 … … 626 628 // generate 2D kernel from 1D realizations 627 629 for (int v = -size, y = 0; v <= size; v++, y++) { 628 for (int u = -size, x = 0; u <= size; u++, x++) {629 preCalc->kernel->kernel[v][u] = preCalc->xKernel->data.F32[x] * preCalc->yKernel->data.F32[y]; // Value of kernel630 }631 } 632 630 for (int u = -size, x = 0; u <= size; u++, x++) { 631 preCalc->kernel->kernel[v][u] = preCalc->xKernel->data.F32[x] * preCalc->yKernel->data.F32[y]; // Value of kernel 632 } 633 } 634 633 635 return preCalc; 634 636 } … … 958 960 for (int vOrder = 0; vOrder <= (i == 0 ? 0 : ringsOrder - uOrder); vOrder++, index++) { 959 961 960 pmSubtractionKernelPreCalc *preCalc = pmSubtractionKernelPreCalcAlloc (PM_SUBTRACTION_KERNEL_RINGS, 0, 0, RINGS_BUFFER, 0.0);962 pmSubtractionKernelPreCalc *preCalc = pmSubtractionKernelPreCalcAlloc (PM_SUBTRACTION_KERNEL_RINGS, 0, 0, RINGS_BUFFER, 0.0); 961 963 double moment = 0.0; // Moment, for penalty 962 964 … … 964 966 // Central pixel is easy 965 967 preCalc->uCoords->data.S32[0] = 0; 966 preCalc->vCoords->data.S32[0] = 0;968 preCalc->vCoords->data.S32[0] = 0; 967 969 preCalc->poly->data.F32[0] = 1.0; 968 970 preCalc->uCoords->n = 1; 969 preCalc->vCoords->n = 1;970 preCalc->poly->n = 1;971 preCalc->vCoords->n = 1; 972 preCalc->poly->n = 1; 971 973 radiusLast = 0; 972 974 moment = 0.0; … … 1025 1027 kernels->v->data.S32[index] = vOrder; 1026 1028 kernels->penalties->data.F32[index] = kernels->penalty * fabsf(moment); 1027 if (!isfinite(kernels->penalties->data.F32[index])) {1028 psAbort ("invalid penalty");1029 }1029 if (!isfinite(kernels->penalties->data.F32[index])) { 1030 psAbort ("invalid penalty"); 1031 } 1030 1032 1031 1033 psTrace("psModules.imcombine", 7, "Kernel %d: %d %d %d\n", index, … … 1117 1119 1118 1120 // currently known descriptions: 1119 // ISIS(...), ISIS_RADIAL(...), HERM(...), DECONV_HERM(...), POIS(...), SPAM(...), 1120 // FRIES(...), GUNK=ISIS(...)+POIS(...), RINGS(...), 1121 // ISIS(...), ISIS_RADIAL(...), HERM(...), DECONV_HERM(...), POIS(...), SPAM(...), 1122 // FRIES(...), GUNK=ISIS(...)+POIS(...), RINGS(...), 1121 1123 // the descriptive name is the set of characters before the ( 1122 1124 1123 1125 type = pmSubtractionKernelsTypeFromString (description); 1124 1126 char *ptr = strchr(description, '('); … … 1130 1132 case PM_SUBTRACTION_KERNEL_HERM: 1131 1133 case PM_SUBTRACTION_KERNEL_DECONV_HERM: 1132 PARSE_STRING_NUMBER(size, ptr, ',', parseStringInt);1133 1134 // Count the number of Gaussians1135 int numGauss = 0;1136 for (char *string = ptr; string; string = strchr(string + 1, '(')) {1137 numGauss++;1138 }1139 1140 fwhms = psVectorAlloc(numGauss, PS_TYPE_F32);1141 orders = psVectorAlloc(numGauss, PS_TYPE_S32);1142 1143 for (int i = 0; i < numGauss; i++) {1144 ptr++;// Eat the '('1145 PARSE_STRING_NUMBER(fwhms->data.F32[i], ptr, ',', parseStringFloat); // Eat "1.234,"1146 PARSE_STRING_NUMBER(orders->data.S32[i], ptr, ')', parseStringInt);// Eat "3)"1147 }1148 1149 ptr++; // Eat ','1150 PARSE_STRING_NUMBER(spatialOrder, ptr, ',', parseStringInt);1151 penalty = parseStringFloat(ptr);1152 1153 return pmSubtractionKernelsGenerate(type, size, spatialOrder, fwhms, orders, inner, binning, ringsOrder, penalty, mode);1134 PARSE_STRING_NUMBER(size, ptr, ',', parseStringInt); 1135 1136 // Count the number of Gaussians 1137 int numGauss = 0; 1138 for (char *string = ptr; string; string = strchr(string + 1, '(')) { 1139 numGauss++; 1140 } 1141 1142 fwhms = psVectorAlloc(numGauss, PS_TYPE_F32); 1143 orders = psVectorAlloc(numGauss, PS_TYPE_S32); 1144 1145 for (int i = 0; i < numGauss; i++) { 1146 ptr++; // Eat the '(' 1147 PARSE_STRING_NUMBER(fwhms->data.F32[i], ptr, ',', parseStringFloat); // Eat "1.234," 1148 PARSE_STRING_NUMBER(orders->data.S32[i], ptr, ')', parseStringInt); // Eat "3)" 1149 } 1150 1151 ptr++; // Eat ',' 1152 PARSE_STRING_NUMBER(spatialOrder, ptr, ',', parseStringInt); 1153 penalty = parseStringFloat(ptr); 1154 1155 return pmSubtractionKernelsGenerate(type, size, spatialOrder, fwhms, orders, inner, binning, ringsOrder, penalty, mode); 1154 1156 1155 1157 case PM_SUBTRACTION_KERNEL_RINGS: … … 1159 1161 PARSE_STRING_NUMBER(spatialOrder, ptr, ',', parseStringInt); 1160 1162 PARSE_STRING_NUMBER(penalty, ptr, ')', parseStringInt); 1161 return pmSubtractionKernelsGenerate(type, size, spatialOrder, fwhms, orders, inner, binning, ringsOrder, penalty, mode);1163 return pmSubtractionKernelsGenerate(type, size, spatialOrder, fwhms, orders, inner, binning, ringsOrder, penalty, mode); 1162 1164 default: 1163 psAbort("Deciphering kernels other than ISIS, HERM, DECONV_HERM or RINGS is not currently supported.");1164 } 1165 psAbort("Deciphering kernels other than ISIS, HERM, DECONV_HERM or RINGS is not currently supported."); 1166 } 1165 1167 return NULL; 1166 1168 } … … 1177 1179 char *ptr = strchr(type, '('); 1178 1180 if (ptr) { 1179 nameLength = ptr - type;1181 nameLength = ptr - type; 1180 1182 } 1181 1183
Note:
See TracChangeset
for help on using the changeset viewer.
