IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Nov 4, 2009, 4:52:05 PM (17 years ago)
Author:
Paul Price
Message:

Soften errors, both in the least-squares matrix/vector construction and in the rejection stage. Softening in the rejection stage seems to be very important so that bright stamps aren't rejected (after which the solution can go crazy). Now carrying around a weight image = 1/variance instead of the variance image. This can be softened, saving many divisions in the matrix/vector construction.

File:
1 edited

Legend:

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

    r25999 r26035  
    2929#define PIXEL_LIST_BUFFER 100           // Number of entries to add to pixel list at a time
    3030#define MIN_SAMPLE_STATS    7           // Minimum number to use sample statistics; otherwise use quartiles
    31 #define USE_SYS_ERR                   // Use systematic error image?
     31#define USE_KERNEL_ERR                  // Use kernel error image?
    3232
    3333//////////////////////////////////////////////////////////////////////////////////////////////////////////////
     
    266266static void convolveVarianceFFT(psImage *target,// Place the result in here
    267267                              psImage *variance, // Variance map to convolve
    268                               psImage *sys, // Systematic error image
     268                              psImage *kernelErr, // Kernel error image
    269269                              psImage *mask, // Mask image
    270270                              psImageMaskType maskVal, // Value to mask
     
    278278
    279279    psImage *subVariance = variance ? psImageSubset(variance, border) : NULL; // Variance map
    280     psImage *subSys = sys ? psImageSubset(sys, border) : NULL; // Systematic error image
     280    psImage *subKE = kernelErr ? psImageSubset(kernelErr, border) : NULL; // Kernel error image
    281281    psImage *subMask = mask ? psImageSubset(mask, border) : NULL; // Mask
    282282
    283283    // XXX Can trim this a little by combining the convolution: only have to take the FFT of the kernel once
    284284    psImage *convVariance = psImageConvolveFFT(NULL, subVariance, subMask, maskVal, kernel); // Convolved variance
    285     psImage *convSys = subSys ? psImageConvolveFFT(NULL, subSys, subMask, maskVal, kernel) : NULL; // Conv sys
     285    psImage *convKE = subKE ? psImageConvolveFFT(NULL, subKE, subMask, maskVal, kernel) : NULL; // Conv KE
    286286
    287287    psFree(subVariance);
    288     psFree(subSys);
     288    psFree(subKE);
    289289    psFree(subMask);
    290290
    291291    // Now, we have to stick it in where it belongs
    292292    int xMin = region.x0, xMax = region.x1, yMin = region.y0, yMax = region.y1; // Bounds of region
    293     if (convSys) {
     293    if (convKE) {
    294294        for (int yTarget = yMin, ySource = size; yTarget < yMax; yTarget++, ySource++) {
    295295            for (int xTarget = xMin, xSource = size; xTarget < xMax; xTarget++, xSource++) {
    296296                target->data.F32[yTarget][xTarget] = convVariance->data.F32[ySource][xSource] +
    297                     convSys->data.F32[ySource][xSource];
     297                    convKE->data.F32[ySource][xSource];
    298298            }
    299299        }
     
    306306
    307307    psFree(convVariance);
    308     psFree(convSys);
     308    psFree(convKE);
    309309
    310310    return;
     
    342342                                  psImage *image, // Image to convolve
    343343                                  psImage *variance, // Variance map to convolve, or NULL
    344                                   psImage *sys, // Systematic error image, or NULL
     344                                  psImage *kernelErr, // Kernel error image, or NULL
    345345                                  psImage *subMask, // Subtraction mask
    346346                                  const pmSubtractionKernels *kernels, // Kernels
     
    379379        convolveFFT(convImage, image, subMask, subBad, *kernelImage, region, background, kernels->size);
    380380        if (variance) {
    381             convolveVarianceFFT(convVariance, variance, sys, subMask, subBad, *kernelVariance, region, kernels->size);
     381            convolveVarianceFFT(convVariance, variance, kernelErr, subMask, subBad, *kernelVariance,
     382                                region, kernels->size);
    382383        }
    383384    } else {
     
    429430}
    430431
    431 #ifdef USE_SYS_ERR
    432 // Generate an image that can be used to track systematic errors
    433 static psImage *subtractionSysErrImage(const psImage *image, // Image from which to make sys err image
    434                                        float sysError // Relative systematic error
    435                                        )
    436 {
    437     if (!isfinite(sysError) || sysError == 0.0) {
     432#ifdef USE_KERNEL_ERR
     433// Generate an image that can be used to track systematic errors in the kernel
     434static psImage *subtractionKernelErrImage(const psImage *image, // Image from which to make kernel error image
     435                                          float kernelError // Relative systematic error in kernel
     436    )
     437{
     438    if (!isfinite(kernelError) || kernelError == 0.0) {
    438439        return NULL;
    439440    }
    440441
    441442    int numCols = image->numCols, numRows = image->numRows; // Size of image
    442     psImage *sys = psImageAlloc(numCols, numRows, PS_TYPE_F32); // Systematic error image
    443 
    444     float sysError2 = PS_SQR(sysError); // Square of the systematic error
     443    psImage *kernelErr = psImageAlloc(numCols, numRows, PS_TYPE_F32); // Kernel error image
     444
     445    float kernelError2 = PS_SQR(kernelError); // Square of the kernel error
    445446    for (int y = 0; y < numRows; y++) {
    446447        for (int x = 0; x < numCols; x++) {
    447             sys->data.F32[y][x] = PS_SQR(image->data.F32[y][x]) * sysError2;
    448         }
    449     }
    450 
    451     return sys;
     448            kernelErr->data.F32[y][x] = PS_SQR(image->data.F32[y][x]) * kernelError2;
     449        }
     450    }
     451
     452    return kernelErr;
    452453}
    453454#endif
     
    892893                psFree(stamp->image1);
    893894                psFree(stamp->image2);
    894                 psFree(stamp->variance);
    895                 stamp->image1 = stamp->image2 = stamp->variance = NULL;
     895                psFree(stamp->weight);
     896                stamp->image1 = stamp->image2 = stamp->weight = NULL;
    896897                psFree(stamp->matrix1);
    897898                psFree(stamp->matrix2);
     
    10401041                                     psImage *convMask, // Output convolved mask
    10411042                                     const pmReadout *ro1, const pmReadout *ro2, // Input readouts
    1042                                      psImage *sys1, psImage *sys2, // Systematic error images
     1043                                     psImage *kernelErr1, psImage *kernelErr2, // Kernel error images
    10431044                                     psImage *subMask, // Input subtraction mask
    10441045                                     psImageMaskType maskBad, // Mask value to give bad pixels
     
    10661067    if (kernels->mode == PM_SUBTRACTION_MODE_1 || kernels->mode == PM_SUBTRACTION_MODE_DUAL) {
    10671068        convolveRegion(out1->image, out1->variance, convMask, &kernelImage, &kernelVariance,
    1068                        ro1->image, ro1->variance, sys1, subMask, kernels, polyValues, background, *region,
    1069                        maskBad, maskPoor, poorFrac, useFFT, false);
     1069                       ro1->image, ro1->variance, kernelErr1, subMask, kernels, polyValues, background,
     1070                       *region, maskBad, maskPoor, poorFrac, useFFT, false);
    10701071    }
    10711072    if (kernels->mode == PM_SUBTRACTION_MODE_2 || kernels->mode == PM_SUBTRACTION_MODE_DUAL) {
    10721073        convolveRegion(out2->image, out2->variance, convMask, &kernelImage, &kernelVariance,
    1073                        ro2->image, ro2->variance, sys2, subMask, kernels, polyValues, background, *region,
    1074                        maskBad, maskPoor, poorFrac, useFFT, kernels->mode == PM_SUBTRACTION_MODE_DUAL);
     1074                       ro2->image, ro2->variance, kernelErr2, subMask, kernels, polyValues, background,
     1075                       *region, maskBad, maskPoor, poorFrac, useFFT,
     1076                       kernels->mode == PM_SUBTRACTION_MODE_DUAL);
    10751077    }
    10761078
     
    11171119    const pmReadout *ro1 = args->data[7]; // Input readout 1
    11181120    const pmReadout *ro2 = args->data[8]; // Input readout 2
    1119     psImage *sys1 = args->data[9]; // Systematic error image 1
    1120     psImage *sys2 = args->data[10]; // Systematic error image 2
     1121    psImage *kernelErr1 = args->data[9]; // Kernel error image 1
     1122    psImage *kernelErr2 = args->data[10]; // Kernel error image 2
    11211123    psImage *subMask = args->data[11]; // Subtraction mask
    11221124    psImageMaskType maskBad = PS_SCALAR_VALUE(args->data[12], PS_TYPE_IMAGE_MASK_DATA); // Output mask value for bad pixels
     
    11281130    bool useFFT = PS_SCALAR_VALUE(args->data[18], U8); // Use FFT for convolution?
    11291131
    1130     return subtractionConvolvePatch(numCols, numRows, x0, y0, out1, out2, convMask, ro1, ro2, sys1, sys2,
    1131                                     subMask, maskBad, maskPoor, poorFrac, region, kernels, doBG, useFFT);
     1132    return subtractionConvolvePatch(numCols, numRows, x0, y0, out1, out2, convMask, ro1, ro2, kernelErr1,
     1133                                    kernelErr2, subMask, maskBad, maskPoor, poorFrac, region, kernels,
     1134                                    doBG, useFFT);
    11321135}
    11331136
    11341137bool pmSubtractionConvolve(pmReadout *out1, pmReadout *out2, const pmReadout *ro1, const pmReadout *ro2,
    11351138                           psImage *subMask, int stride, psImageMaskType maskBad, psImageMaskType maskPoor,
    1136                            float poorFrac, float sysError, const psRegion *region,
     1139                           float poorFrac, float kernelError, const psRegion *region,
    11371140                           const pmSubtractionKernels *kernels, bool doBG, bool useFFT)
    11381141{
     
    11721175    PS_ASSERT_FLOAT_LARGER_THAN_OR_EQUAL(poorFrac, 0.0, false);
    11731176    PS_ASSERT_FLOAT_LESS_THAN_OR_EQUAL(poorFrac, 1.0, false);
    1174     PS_ASSERT_FLOAT_LARGER_THAN_OR_EQUAL(sysError, 0.0, false);
    1175     PS_ASSERT_FLOAT_LESS_THAN_OR_EQUAL(sysError, 1.0, false);
     1177    PS_ASSERT_FLOAT_LARGER_THAN_OR_EQUAL(kernelError, 0.0, false);
     1178    PS_ASSERT_FLOAT_LESS_THAN_OR_EQUAL(kernelError, 1.0, false);
    11761179    if (region && psRegionIsNaN(*region)) {
    11771180        psString string = psRegionToString(*region);
     
    12321235    }
    12331236
    1234     psImage *sys1 = NULL, *sys2 = NULL; // Systematic error images
    1235 #ifdef USE_SYS_ERR
     1237    psImage *kernelErr1 = NULL, *kernelErr2 = NULL; // Kernel error images
     1238#ifdef USE_KERNEL_ERR
    12361239    if (kernels->mode == PM_SUBTRACTION_MODE_1 || kernels->mode == PM_SUBTRACTION_MODE_DUAL) {
    1237         sys1 = subtractionSysErrImage(ro1->image, sysError);
     1240        kernelErr1 = subtractionKernelErrImage(ro1->image, kernelError);
    12381241    }
    12391242    if (kernels->mode == PM_SUBTRACTION_MODE_2 || kernels->mode == PM_SUBTRACTION_MODE_DUAL) {
    1240         sys2 = subtractionSysErrImage(ro2->image, sysError);
     1243        kernelErr2 = subtractionKernelErrImage(ro2->image, kernelError);
    12411244    }
    12421245#endif
     
    12891292                psArrayAdd(args, 1, (pmReadout*)ro1); // Casting away const
    12901293                psArrayAdd(args, 1, (pmReadout*)ro2); // Casting away const
    1291                 psArrayAdd(args, 1, sys1);
    1292                 psArrayAdd(args, 1, sys2);
     1294                psArrayAdd(args, 1, kernelErr1);
     1295                psArrayAdd(args, 1, kernelErr2);
    12931296                psArrayAdd(args, 1, subMask);
    12941297                PS_ARRAY_ADD_SCALAR(args, maskBad, PS_TYPE_IMAGE_MASK);
     
    13061309                psFree(job);
    13071310            } else {
    1308                 subtractionConvolvePatch(numCols, numRows, x0, y0, out1, out2, convMask, ro1, ro2, sys1, sys2,
    1309                                          subMask, maskBad, maskPoor, poorFrac, subRegion, kernels, doBG,
    1310                                          useFFT);
     1311                subtractionConvolvePatch(numCols, numRows, x0, y0, out1, out2, convMask, ro1, ro2,
     1312                                         kernelErr1, kernelErr2, subMask, maskBad, maskPoor, poorFrac,
     1313                                         subRegion, kernels, doBG, useFFT);
    13111314            }
    13121315            psFree(subRegion);
     
    13331336    psImageConvolveSetThreads(oldThreads);
    13341337
    1335     psFree(sys1);
    1336     psFree(sys2);
     1338    psFree(kernelErr1);
     1339    psFree(kernelErr2);
    13371340
    13381341    // Calculate covariances
Note: See TracChangeset for help on using the changeset viewer.