IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 26479


Ignore:
Timestamp:
Dec 23, 2009, 8:08:30 AM (16 years ago)
Author:
eugene
Message:

adding deconvolved hermite functions

Location:
branches/eam_branches/20091201/psModules/src/imcombine
Files:
2 added
3 edited

Legend:

Unmodified
Added
Removed
  • branches/eam_branches/20091201/psModules/src/imcombine/Makefile.am

    r26474 r26479  
    1414        pmSubtractionKernels.c  \
    1515        pmSubtractionHermitian.c        \
     16        pmSubtractionDeconvolve.c       \
    1617        pmSubtractionMask.c     \
    1718        pmSubtractionMatch.c    \
     
    3435        pmSubtractionKernels.h  \
    3536        pmSubtractionHermitian.h        \
     37        pmSubtractionDeconvolve.h       \
    3638        pmSubtractionMask.h     \
    3739        pmSubtractionMatch.h    \
  • branches/eam_branches/20091201/psModules/src/imcombine/pmSubtractionKernels.c

    r26473 r26479  
    346346    return kernels;
    347347}
     348
     349# if (0)
     350pmSubtractionKernels *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(&params, "(%.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
    348469
    349470//////////////////////////////////////////////////////////////////////////////////////////////////////////////
  • branches/eam_branches/20091201/psModules/src/imcombine/pmSubtractionKernels.h

    r26473 r26479  
    1111    PM_SUBTRACTION_KERNEL_ISIS,         ///< Traditional kernel --- gaussians modified by polynomials
    1212    PM_SUBTRACTION_KERNEL_HERM,         ///< Hermitian polynomial kernels
     13    PM_SUBTRACTION_KERNEL_DECON_HERM,   ///< Deconvolved Hermitian polynomial kernels
    1314    PM_SUBTRACTION_KERNEL_SPAM,         ///< Summed Pixels for Advanced Matching --- summed delta functions
    1415    PM_SUBTRACTION_KERNEL_FRIES,        ///< Fibonacci Radius Increases Excellence of Subtraction
     
    3132    psString description;               ///< Description of the kernel parameters
    3233    long num;                           ///< Number of kernel components (not including the spatial ones)
    33     psVector *u, *v;                    ///< Offset (for POIS) or polynomial order (for ISIS or HERM)
    34     psVector *widths;                   ///< Gaussian FWHMs (ISIS or HERM)
     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)
    3536    psVector *uStop, *vStop;            ///< Width of kernel element (SPAM,FRIES only)
    36     psArray *preCalc;                   ///< Array of images containing pre-calculated kernel (for ISIS or HERM)
     37    psArray *preCalc;                   ///< Array of images containing pre-calculated kernel (for ISIS, HERM or DECON_HERM)
    3738    float penalty;                      ///< Penalty for wideness
    3839    psVector *penalties;                ///< Penalty for each kernel component
     
    7071        PS_ASSERT_VECTOR_SIZE((KERNELS)->widths, (KERNELS)->num, RETURNVALUE); \
    7172    } \
     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    } \
    7278    if ((KERNELS)->uStop || (KERNELS)->vStop) { \
    7379        PS_ASSERT_VECTOR_NON_NULL((KERNELS)->uStop, RETURNVALUE); \
     
    157163                                               );
    158164
     165/// Generate DECON_HERM kernels
     166pmSubtractionKernels *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
    159174/// Generate SPAM kernels
    160175pmSubtractionKernels *pmSubtractionKernelsSPAM(int size, ///< Half-size of the kernel
Note: See TracChangeset for help on using the changeset viewer.