IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Jan 2, 2010, 6:13:37 PM (17 years ago)
Author:
eugene
Message:

adding window to dual convolution; fixing normalization for deconvolved-hermitians

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/eam_branches/20091201/psModules/src/imcombine/pmSubtractionKernels.c

    r26491 r26502  
    132132            kernels->preCalc->data[index] = NULL;
    133133            kernels->penalties->data.F32[index] = kernels->penalty * PS_SQR(PS_SQR(u) + PS_SQR(v));
     134            if (!isfinite(kernels->penalties->data.F32[index])) {
     135                psAbort ("invalid penalty");
     136            }
    134137
    135138            psTrace("psModules.imcombine", 7, "Kernel %d: %d %d\n", index, u, v);
     
    146149}
    147150
    148 bool pmSubtractionKernelPreCalcNormalize (pmSubtractionKernels *kernels, pmSubtractionKernelPreCalc *preCalc, int index, int size, int uOrder, int vOrder, float fwhm) {
     151bool pmSubtractionKernelPreCalcNormalize (pmSubtractionKernels *kernels, pmSubtractionKernelPreCalc *preCalc, int index, int size, int uOrder, int vOrder, float fwhm, bool AlardLuptonStyle) {
    149152
    150153    // Calculate moments
     
    157160    }
    158161
    159     // Normalize sum of kernel component to unity for even functions
    160     if (uOrder % 2 == 0 && vOrder % 2 == 0) {
    161         double sum = 0.0;   // Sum of kernel component
    162         for (int v = -size; v <= size; v++) {
    163             for (int u = -size; u <= size; u++) {
    164                 sum += preCalc->kernel->kernel[v][u];
    165             }
    166         }
    167         sum = 1.0 / sqrt(sum);
    168         psBinaryOp(preCalc->xKernel, preCalc->xKernel, "*", psScalarAlloc(sum, PS_TYPE_F32));
    169         psBinaryOp(preCalc->yKernel, preCalc->yKernel, "*", psScalarAlloc(sum, PS_TYPE_F32));
    170         psBinaryOp(preCalc->kernel->image, preCalc->kernel->image, "*", psScalarAlloc(PS_SQR(sum), PS_TYPE_F32));
    171 
    172 #if 1
    173         fprintf(stderr, "%d norm: %lf, null: %f\n", index, sum, preCalc->kernel->kernel[0][0]);
    174 #endif
    175                    
    176         preCalc->kernel->kernel[0][0] -= 1.0;
    177         moment *= PS_SQR(sum);
    178     }
    179 
    180 #if 1
     162    // we have 4 cases here:
     163    // 1) for odd functions, normalize the kernel by the maximum swing / Npix
     164    // 2) for even functions, normalize the kernel to unity
     165    // 3) for alard-lupton style normalization, subtract 1 from the 0,0 pixel for all even functions
     166    // 4) for deconvolved hermitians, subtract 1 from the 0,0 pixel for the 0,0 function(s)
     167
    181168    double sum = 0.0;   // Sum of kernel component
     169    double min = FLT_MAX;
     170    double max = FLT_MIN;
     171
    182172    for (int v = -size; v <= size; v++) {
    183173        for (int u = -size; u <= size; u++) {
    184174            sum += preCalc->kernel->kernel[v][u];
     175            min = PS_MIN(preCalc->kernel->kernel[v][u], min);
     176            max = PS_MAX(preCalc->kernel->kernel[v][u], max);
    185177        }
    186178    }
    187     fprintf(stderr, "%d sum: %lf\n", index, sum);
     179#if 1
     180    fprintf(stderr, "%d raw: %lf, null: %f, min: %lf, max: %lf, moment: %lf\n", index, sum, preCalc->kernel->kernel[0][0], min, max, moment);
     181#endif
     182
     183    // only even terms have non-zero sums
     184    if ((uOrder % 2 == 0) && (vOrder % 2 == 0)) {
     185        moment /= sum;
     186    } else {
     187        moment = 0.0;
     188    }
     189
     190    bool zeroNull = false;
     191    float scale1D = 1.0 / sqrt(sum);
     192    float scale2D = 1.0 / sum;
     193
     194    if (AlardLuptonStyle && (uOrder % 2 == 0 && vOrder % 2 == 0)) {
     195        zeroNull = true;
     196    }
     197    if (!AlardLuptonStyle && (uOrder == 0 && vOrder == 0)) {
     198        zeroNull = true;
     199    }
     200    if ((uOrder % 2) || (vOrder % 2)) {
     201        // scale2D = 1.0 / (preCalc->kernel->image->numCols * preCalc->kernel->image->numRows * max);
     202        scale2D = 1.0 / max;
     203        scale1D = sqrt(scale2D);
     204    }
     205
     206    psBinaryOp(preCalc->xKernel, preCalc->xKernel, "*", psScalarAlloc(scale1D, PS_TYPE_F32));
     207    psBinaryOp(preCalc->yKernel, preCalc->yKernel, "*", psScalarAlloc(scale1D, PS_TYPE_F32));
     208    psBinaryOp(preCalc->kernel->image, preCalc->kernel->image, "*", psScalarAlloc(scale2D, PS_TYPE_F32));
     209    if (zeroNull) {
     210        preCalc->kernel->kernel[0][0] -= 1.0;
     211    }
     212
     213#if 1
     214    sum = 0.0;   // Sum of kernel component
     215    min = FLT_MAX;
     216    max = FLT_MIN;
     217    for (int v = -size; v <= size; v++) {
     218        for (int u = -size; u <= size; u++) {
     219            sum += preCalc->kernel->kernel[v][u];
     220            min = PS_MIN(preCalc->kernel->kernel[v][u], min);
     221            max = PS_MAX(preCalc->kernel->kernel[v][u], max);
     222        }
     223    }
     224    fprintf(stderr, "%d mod: %lf, null: %f, min: %lf, max: %lf, scale: %f\n", index, sum, preCalc->kernel->kernel[0][0], min, max, scale2D);
    188225#endif
    189226
     
    196233    kernels->preCalc->data[index] = preCalc;
    197234    kernels->penalties->data.F32[index] = kernels->penalty * fabsf(moment);
     235    if (!isfinite(kernels->penalties->data.F32[index])) {
     236        psAbort ("invalid penalty");
     237    }
    198238
    199239    psTrace("psModules.imcombine", 7, "Kernel %d: %f %d %d %f\n", index,
     
    250290
    251291                pmSubtractionKernelPreCalc *preCalc = pmSubtractionKernelPreCalcAlloc(PM_SUBTRACTION_KERNEL_ISIS, uOrder, vOrder, size, sigma); // structure to hold precalculated values
    252                 pmSubtractionKernelPreCalcNormalize (kernels, preCalc, index, size, uOrder, vOrder, fwhms->data.F32[i]);
     292                pmSubtractionKernelPreCalcNormalize (kernels, preCalc, index, size, uOrder, vOrder, fwhms->data.F32[i], true);
    253293            }
    254294        }
     
    302342            for (int vOrder = 0; vOrder <= orders->data.S32[i] - uOrder; vOrder++, index++) {
    303343                pmSubtractionKernelPreCalc *preCalc = pmSubtractionKernelPreCalcAlloc(PM_SUBTRACTION_KERNEL_HERM, uOrder, vOrder, size, sigma); // structure to hold precalculated values
    304                 pmSubtractionKernelPreCalcNormalize (kernels, preCalc, index, size, uOrder, vOrder, fwhms->data.F32[i]);
     344                pmSubtractionKernelPreCalcNormalize (kernels, preCalc, index, size, uOrder, vOrder, fwhms->data.F32[i], true);
    305345            }
    306346        }
     
    338378        int gaussOrder = orders->data.S32[i]; // Polynomial order to apply to Gaussian
    339379        psStringAppend(&params, "(%.1f,%d)", fwhms->data.F32[i], orders->data.S32[i]);
    340         num += (gaussOrder + 1) * (gaussOrder + 2) / 2;
     380        num += PS_SQR(gaussOrder + 1);
    341381    }
    342382
     
    349389    // XXXXX hard-wired reference sigma for now of 1.7 pix (== 4.0 pix fwhm == 1.0 arcsec in simtest)
    350390    // generate the Gaussian deconvolution kernel
    351     # define DECONV_SIGMA 1.7
     391    # define DECONV_SIGMA 1.6
    352392    psKernel *kernelGauss = pmSubtractionDeconvolveGauss (size, DECONV_SIGMA);
     393
     394# if 1
     395    psArray *deconKernels = psArrayAllocEmpty(100);
     396# endif
    353397
    354398    // Set the kernel parameters
     
    357401        // Iterate over (u,v) order
    358402        for (int uOrder = 0; uOrder <= orders->data.S32[i]; uOrder++) {
    359             for (int vOrder = 0; vOrder <= orders->data.S32[i] - uOrder; vOrder++, index++) {
     403            for (int vOrder = 0; vOrder <= orders->data.S32[i]; vOrder++, index++) {
    360404
    361405                pmSubtractionKernelPreCalc *preCalc = pmSubtractionKernelPreCalcAlloc(PM_SUBTRACTION_KERNEL_HERM, uOrder, vOrder, size, sigma); // structure to hold precalculated values
     
    365409                preCalc->kernel = pmSubtractionDeconvolveKernel(kernelTarget, kernelGauss); // Kernel
    366410
     411                pmSubtractionKernelPreCalcNormalize (kernels, preCalc, index, size, uOrder, vOrder, fwhms->data.F32[i], false);
     412
    367413                // XXXX test demo that deconvolved kernel is valid
    368                 // psImage *kernelConv = psImageConvolveFFT(NULL, preCalc->kernel->image, NULL, 0, kernelGauss);
    369                 // pmSubtractionVisualShowSubtraction (kernelTarget->image, preCalc->kernel->image, kernelConv);
    370 
    371                 pmSubtractionKernelPreCalcNormalize (kernels, preCalc, index, size, uOrder, vOrder, fwhms->data.F32[i]);
     414# if 1
     415                psImage *kernelConv = psImageConvolveFFT(NULL, preCalc->kernel->image, NULL, 0, kernelGauss);
     416                psArrayAdd (deconKernels, 100, kernelConv);
     417                psFree (kernelConv);
     418
     419                if (!uOrder && !vOrder){
     420                    pmSubtractionVisualShowSubtraction (kernelTarget->image, preCalc->kernel->image, kernelConv);
     421                }
     422# endif
    372423            }
    373424        }
    374425    }
     426
     427# if 1
     428    psImage *dot = psImageAlloc(deconKernels->n, deconKernels->n, PS_TYPE_F32);
     429    for (int i = 0; i < deconKernels->n; i++) {
     430        for (int j = 0; j <= i; j++) {
     431            psImage *t1 = deconKernels->data[i];
     432            psImage *t2 = deconKernels->data[j];
     433
     434            double sum = 0.0;
     435            for (int iy = 0; iy < t1->numRows; iy++) {
     436                for (int ix = 0; ix < t1->numCols; ix++) {
     437                    sum += t1->data.F32[iy][ix] * t2->data.F32[iy][ix];
     438                }
     439            }
     440            dot->data.F32[j][i] = sum;
     441            dot->data.F32[i][j] = sum;
     442        }
     443    }
     444    pmSubtractionVisualShowSubtraction (dot, NULL, NULL);
     445    psFree (dot);
     446    psFree (deconKernels);
     447# endif
    375448
    376449    return kernels;
     
    857930                kernels->v->data.S32[index] = vOrder;
    858931                kernels->penalties->data.F32[index] = kernels->penalty * fabsf(moment);
     932                if (!isfinite(kernels->penalties->data.F32[index])) {
     933                    psAbort ("invalid penalty");
     934                }
    859935
    860936                psTrace("psModules.imcombine", 7, "Kernel %d: %d %d %d\n", index,
Note: See TracChangeset for help on using the changeset viewer.