Changeset 14363 for trunk/psModules/src/imcombine/pmSubtractionKernels.c
- Timestamp:
- Jul 23, 2007, 11:43:44 AM (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules/src/imcombine/pmSubtractionKernels.c
r14360 r14363 508 508 509 509 // RINGS --- just what it says 510 pmSubtractionKernels *pmSubtractionKernelsRINGS(int size, int spatialOrder, int ringsOrder)510 pmSubtractionKernels *pmSubtractionKernelsRINGS(int size, int spatialOrder, int inner, int ringsOrder) 511 511 { 512 512 PS_ASSERT_INT_POSITIVE(size, NULL); 513 513 PS_ASSERT_INT_NONNEGATIVE(spatialOrder, NULL); 514 PS_ASSERT_INT_NONNEGATIVE(inner, NULL); 515 PS_ASSERT_INT_LESS_THAN(inner, size, NULL); 514 516 PS_ASSERT_INT_NONNEGATIVE(ringsOrder, NULL); 515 517 516 int numRings = size + 1; // Number of rings; 0 --> size, inclusive 518 int fibNum = 0; // Number of Fibonacci values 519 int fibLast = 1, fibTotal = 2; // Fibonacci sequence 520 while (fibTotal < size - inner) { 521 int temp = fibTotal; 522 fibTotal += fibLast; 523 fibLast = temp; 524 fibNum++; 525 } 526 527 int numInner = inner; // Number of pixels in the inner region 528 int numOuter = fibNum; // Number of summed pixels in the outer region 529 530 int numRings = numOuter + numInner; // Number of rings (not including the central pixel) 517 531 int numPoly = (ringsOrder + 1) * (ringsOrder + 2) / 2; // Number of polynomial variants of each ring 518 532 int numSpatial = (spatialOrder + 1) * (spatialOrder + 2) / 2; // Number of spatial variations of a kernel 519 533 520 int num = numRings * numPoly* numSpatial; // Total number of basis functions534 int num = (numRings * numPoly + 1) * numSpatial; // Total number of basis functions 521 535 522 536 pmSubtractionKernels *kernels = pmSubtractionKernelsAlloc(num, PM_SUBTRACTION_KERNEL_GUNK, … … 526 540 size, ringsOrder, spatialOrder, num); 527 541 528 kernels->widths = psVectorAlloc(num, PS_TYPE_S32);529 542 kernels->preCalc = psArrayAlloc(num); 530 543 531 544 // Set the Gaussian kernel parameters 532 for (int i = 0, index = 0; i < size; i++) { 545 int fibIndex = 1, fibIndexMinus1 = 1; // Fibonnacci parameters 546 int radiusLast = 0; // Last radius 547 for (int i = 0, index = 0; i < numRings; i++) { 533 548 // Iterate over (u,v) order 534 549 for (int uOrder = 0; uOrder <= (i == 0 ? 0 : ringsOrder); uOrder++) { … … 539 554 psVector *vCoords = data->data[1] = psVectorAllocEmpty(RINGS_BUFFER, PS_TYPE_S32); // v coords 540 555 psVector *poly = data->data[2] = psVectorAllocEmpty(RINGS_BUFFER, PS_TYPE_F32); // Polynomial 556 541 557 if (i == 0) { 558 // Central pixel is easy 542 559 uCoords->data.S32[0] = vCoords->data.S32[0] = 0; 543 560 poly->data.F32[0] = 0; 544 561 uCoords->n = vCoords->n = poly->n = 1; 562 radiusLast = 0; 545 563 } else { 546 float radius = i; // Radius of ring 547 float lower2 = PS_SQR(radius - 0.5); // Lower limit of radius^2 548 float upper2 = PS_SQR(radius + 0.5); // Upper limit of radius^2 564 float lower2; // Lower limit of radius^2 565 float upper2; // Upper limit of radius^2 566 567 if (i < numInner) { 568 // A ring every pixel width 569 float radius = i; 570 lower2 = PS_SQR(radius - 0.5); 571 upper2 = PS_SQR(radius + 0.5); 572 radiusLast = i; 573 } else { 574 // Rings Fibonacci distributed (2, 3, 5...) 575 int fibNew = fibIndex + fibIndexMinus1; 576 fibIndexMinus1 = fibIndex; 577 fibIndex = fibNew; 578 579 float radiusLower = radiusLast + 1; 580 radiusLast = radiusLower + fibIndex; 581 float radiusUpper = radiusLast; 582 583 lower2 = PS_SQR(radiusLower - 0.5); 584 upper2 = PS_SQR(radiusUpper + 0.5); 585 } 549 586 550 587 int j = 0; // Index for data … … 609 646 for (int yOrder = 0; yOrder <= spatialOrder - xOrder; yOrder++, index++) { 610 647 kernels->preCalc->data[index] = data; 611 kernels->widths->data.S32[index] = PS_SQR(i);612 648 kernels->u->data.S32[index] = uOrder; 613 649 kernels->v->data.S32[index] = vOrder; … … 646 682 return pmSubtractionKernelsGUNK(size, spatialOrder, sigmas, orders, inner); 647 683 case PM_SUBTRACTION_KERNEL_RINGS: 648 return pmSubtractionKernelsRINGS(size, ringsOrder, spatialOrder);684 return pmSubtractionKernelsRINGS(size, ringsOrder, inner, spatialOrder); 649 685 default: 650 686 psError(PS_ERR_BAD_PARAMETER_VALUE, true, "Unknown kernel type: %x", type);
Note:
See TracChangeset
for help on using the changeset viewer.
