IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Jul 23, 2007, 11:43:44 AM (19 years ago)
Author:
Paul Price
Message:

Fibonnacci binning for rings --- they get wider at larger radii. This keeps the number of parameters down.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/psModules/src/imcombine/pmSubtractionKernels.c

    r14360 r14363  
    508508
    509509// RINGS --- just what it says
    510 pmSubtractionKernels *pmSubtractionKernelsRINGS(int size, int spatialOrder, int ringsOrder)
     510pmSubtractionKernels *pmSubtractionKernelsRINGS(int size, int spatialOrder, int inner, int ringsOrder)
    511511{
    512512    PS_ASSERT_INT_POSITIVE(size, NULL);
    513513    PS_ASSERT_INT_NONNEGATIVE(spatialOrder, NULL);
     514    PS_ASSERT_INT_NONNEGATIVE(inner, NULL);
     515    PS_ASSERT_INT_LESS_THAN(inner, size, NULL);
    514516    PS_ASSERT_INT_NONNEGATIVE(ringsOrder, NULL);
    515517
    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)
    517531    int numPoly = (ringsOrder + 1) * (ringsOrder + 2) / 2; // Number of polynomial variants of each ring
    518532    int numSpatial = (spatialOrder + 1) * (spatialOrder + 2) / 2; // Number of spatial variations of a kernel
    519533
    520     int num = numRings * numPoly * numSpatial; // Total number of basis functions
     534    int num = (numRings * numPoly + 1) * numSpatial; // Total number of basis functions
    521535
    522536    pmSubtractionKernels *kernels = pmSubtractionKernelsAlloc(num, PM_SUBTRACTION_KERNEL_GUNK,
     
    526540             size, ringsOrder, spatialOrder, num);
    527541
    528     kernels->widths = psVectorAlloc(num, PS_TYPE_S32);
    529542    kernels->preCalc = psArrayAlloc(num);
    530543
    531544    // 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++) {
    533548        // Iterate over (u,v) order
    534549        for (int uOrder = 0; uOrder <= (i == 0 ? 0 : ringsOrder); uOrder++) {
     
    539554                psVector *vCoords = data->data[1] = psVectorAllocEmpty(RINGS_BUFFER, PS_TYPE_S32); // v coords
    540555                psVector *poly = data->data[2] = psVectorAllocEmpty(RINGS_BUFFER, PS_TYPE_F32); // Polynomial
     556
    541557                if (i == 0) {
     558                    // Central pixel is easy
    542559                    uCoords->data.S32[0] = vCoords->data.S32[0] = 0;
    543560                    poly->data.F32[0] = 0;
    544561                    uCoords->n = vCoords->n = poly->n = 1;
     562                    radiusLast = 0;
    545563                } 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                    }
    549586
    550587                    int j = 0;          // Index for data
     
    609646                    for (int yOrder = 0; yOrder <= spatialOrder - xOrder; yOrder++, index++) {
    610647                        kernels->preCalc->data[index] = data;
    611                         kernels->widths->data.S32[index] = PS_SQR(i);
    612648                        kernels->u->data.S32[index] = uOrder;
    613649                        kernels->v->data.S32[index] = vOrder;
     
    646682        return pmSubtractionKernelsGUNK(size, spatialOrder, sigmas, orders, inner);
    647683      case PM_SUBTRACTION_KERNEL_RINGS:
    648         return pmSubtractionKernelsRINGS(size, ringsOrder, spatialOrder);
     684        return pmSubtractionKernelsRINGS(size, ringsOrder, inner, spatialOrder);
    649685      default:
    650686        psError(PS_ERR_BAD_PARAMETER_VALUE, true, "Unknown kernel type: %x", type);
Note: See TracChangeset for help on using the changeset viewer.