IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 23307


Ignore:
Timestamp:
Mar 12, 2009, 2:42:22 PM (17 years ago)
Author:
Paul Price
Message:

Adding function pmSubtractionMatchPrecalc to convolve using a kernel that's already been calculated.

Location:
trunk/psModules/src/imcombine
Files:
2 edited

Legend:

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

    r23259 r23307  
    9090}
    9191
     92// Check input arguments
     93static bool subtractionMatchCheck(pmReadout *conv1, pmReadout *conv2, // Convolved images
     94                                  const pmReadout *ro1, const pmReadout *ro2, // Input images
     95                                  int stride, // Size for convolution patches
     96                                  float sysError, // Relative systematic error
     97                                  psImageMaskType maskVal, // Value to mask for input
     98                                  psImageMaskType maskBad, // Mask for output bad pixels
     99                                  psImageMaskType maskPoor, // Mask for output poor pixels
     100                                  float poorFrac, // Fraction for "poor"
     101                                  float badFrac,   // Maximum fraction of bad input pixels to accept
     102                                  pmSubtractionMode subMode // Mode of subtraction
     103                                  )
     104{
     105    if (subMode != PM_SUBTRACTION_MODE_2) {
     106        PM_ASSERT_READOUT_NON_NULL(conv1, false);
     107        if (conv1->image) {
     108            psFree(conv1->image);
     109            conv1->image = NULL;
     110        }
     111        if (conv1->mask) {
     112            psFree(conv1->mask);
     113            conv1->mask = NULL;
     114        }
     115        if (conv1->variance) {
     116            psFree(conv1->variance);
     117            conv1->variance = NULL;
     118        }
     119    }
     120    if (subMode != PM_SUBTRACTION_MODE_1) {
     121        PM_ASSERT_READOUT_NON_NULL(conv2, false);
     122        if (conv2->image) {
     123            psFree(conv2->image);
     124            conv2->image = NULL;
     125        }
     126        if (conv2->mask) {
     127            psFree(conv2->mask);
     128            conv2->mask = NULL;
     129        }
     130        if (conv2->variance) {
     131            psFree(conv2->variance);
     132            conv2->variance = NULL;
     133        }
     134    }
     135
     136    PM_ASSERT_READOUT_NON_NULL(ro1, false);
     137    PM_ASSERT_READOUT_NON_NULL(ro2, false);
     138    PM_ASSERT_READOUT_IMAGE(ro1, false);
     139    PM_ASSERT_READOUT_IMAGE(ro2, false);
     140    PS_ASSERT_IMAGES_SIZE_EQUAL(ro1->image, ro2->image, false);
     141    PS_ASSERT_INT_NONNEGATIVE(stride, false);
     142    if (isfinite(sysError)) {
     143        PS_ASSERT_FLOAT_LARGER_THAN_OR_EQUAL(sysError, 0.0, false);
     144        PS_ASSERT_FLOAT_LESS_THAN(sysError, 1.0, false);
     145    }
     146    // Don't care about maskVal
     147    // Don't care about maskBad
     148    // Don't care about maskPoor
     149    PS_ASSERT_FLOAT_LARGER_THAN(poorFrac, 0.0, false);
     150    PS_ASSERT_FLOAT_LESS_THAN_OR_EQUAL(poorFrac, 1.0, false);
     151    if (isfinite(badFrac)) {
     152        PS_ASSERT_FLOAT_LARGER_THAN(badFrac, 0.0, false);
     153        PS_ASSERT_FLOAT_LESS_THAN_OR_EQUAL(badFrac, 1.0, false);
     154    }
     155
     156    return true;
     157}
     158
     159
     160
     161bool pmSubtractionMatchPrecalc(pmReadout *conv1, pmReadout *conv2, const pmReadout *ro1, const pmReadout *ro2,
     162                               pmSubtractionKernels *kernel, psRegion *region, int stride, float sysError,
     163                               psImageMaskType maskVal, psImageMaskType maskBad, psImageMaskType maskPoor,
     164                               float poorFrac, float badFrac)
     165{
     166    PM_ASSERT_SUBTRACTION_KERNELS_NON_NULL(kernel, false);
     167    pmSubtractionMode subMode = kernel->mode; // Subtraction mode: which input to convolve
     168    if (!subtractionMatchCheck(conv1, conv2, ro1, ro2, stride, sysError, maskVal, maskBad, maskPoor,
     169                               poorFrac, badFrac, subMode)) {
     170        return false;
     171    }
     172
     173    psImage *subMask = pmSubtractionMask(ro1->mask, ro2 ? ro2->mask : NULL, maskVal, kernel->size, 0,
     174                                         badFrac, useFFT); // Subtraction mask
     175    if (!subMask) {
     176        psError(PS_ERR_UNKNOWN, false, "Unable to generate subtraction mask.");
     177        return false;
     178    }
     179
     180    psTrace("psModules.imcombine", 2, "Convolving...\n");
     181    if (!pmSubtractionConvolve(conv1, conv2, ro1, ro2, subMask, stride, maskBad, maskPoor, poorFrac,
     182                               sysError, region, kernel, true, useFFT)) {
     183        psError(PS_ERR_UNKNOWN, false, "Unable to convolve image.");
     184        psFree(subMask);
     185        return false;
     186    }
     187
     188    psFree(subMask);
     189
     190    return true;
     191}
     192
    92193
    93194bool pmSubtractionMatch(pmReadout *conv1, pmReadout *conv2, const pmReadout *ro1, const pmReadout *ro2,
     
    101202                        psImageMaskType maskPoor, float poorFrac, float badFrac, pmSubtractionMode subMode)
    102203{
    103     if (subMode != PM_SUBTRACTION_MODE_2) {
    104         PM_ASSERT_READOUT_NON_NULL(conv1, false);
    105         if (conv1->image) {
    106             psFree(conv1->image);
    107             conv1->image = NULL;
    108         }
    109         if (conv1->mask) {
    110             psFree(conv1->mask);
    111             conv1->mask = NULL;
    112         }
    113         if (conv1->variance) {
    114             psFree(conv1->variance);
    115             conv1->variance = NULL;
    116         }
    117     }
    118     if (subMode != PM_SUBTRACTION_MODE_1) {
    119         PM_ASSERT_READOUT_NON_NULL(conv2, false);
    120         if (conv2->image) {
    121             psFree(conv2->image);
    122             conv2->image = NULL;
    123         }
    124         if (conv2->mask) {
    125             psFree(conv2->mask);
    126             conv2->mask = NULL;
    127         }
    128         if (conv2->variance) {
    129             psFree(conv2->variance);
    130             conv2->variance = NULL;
    131         }
    132     }
    133 
    134     PM_ASSERT_READOUT_NON_NULL(ro1, false);
    135     PM_ASSERT_READOUT_NON_NULL(ro2, false);
    136     PM_ASSERT_READOUT_IMAGE(ro1, false);
    137     PM_ASSERT_READOUT_IMAGE(ro2, false);
    138     PS_ASSERT_IMAGES_SIZE_EQUAL(ro1->image, ro2->image, false);
     204    if (!subtractionMatchCheck(conv1, conv2, ro1, ro2, stride, sysError, maskVal, maskBad, maskPoor,
     205                               poorFrac, badFrac, subMode)) {
     206        return false;
     207    }
    139208
    140209    PS_ASSERT_INT_NONNEGATIVE(footprint, false);
    141     PS_ASSERT_INT_NONNEGATIVE(stride, false);
    142210    // regionSize can be just about anything (except maybe negative, but it can be NAN)
    143211    PS_ASSERT_FLOAT_LARGER_THAN(stampSpacing, 0.0, false);
     
    168236    PS_ASSERT_INT_POSITIVE(iter, false);
    169237    PS_ASSERT_FLOAT_LARGER_THAN(rej, 0.0, false);
    170     if (isfinite(sysError)) {
    171         PS_ASSERT_FLOAT_LARGER_THAN_OR_EQUAL(sysError, 0.0, NULL);
    172         PS_ASSERT_FLOAT_LESS_THAN(sysError, 1.0, NULL);
    173     }
    174     // Don't care about maskVal
    175     // Don't care about maskBad
    176     // Don't care about maskPoor
    177     PS_ASSERT_FLOAT_LARGER_THAN(poorFrac, 0.0, NULL);
    178     PS_ASSERT_FLOAT_LESS_THAN_OR_EQUAL(poorFrac, 1.0, NULL);
    179     if (isfinite(badFrac)) {
    180         PS_ASSERT_FLOAT_LARGER_THAN(badFrac, 0.0, NULL);
    181         PS_ASSERT_FLOAT_LESS_THAN_OR_EQUAL(badFrac, 1.0, NULL);
    182     }
    183238
    184239    // If the stamp footprint is smaller than the kernel size, then we won't get much signal in the outer
  • trunk/psModules/src/imcombine/pmSubtractionMatch.h

    r21183 r23307  
    4848    );
    4949
     50/// Match two images using precalculated kernel
     51bool pmSubtractionMatchPrecalc(pmReadout *conv1, ///< Output convolved data for image 1
     52                               pmReadout *conv2, ///< Output convolved data for image 2
     53                               const pmReadout *ro1, ///< Image 1
     54                               const pmReadout *ro2, ///< Image 2
     55                               pmSubtractionKernels *kernels, ///< Pre-calculated matching kernel
     56                               psRegion *region, ///< Region of applicability for kernel
     57                               int stride, ///< Size for convolution patches
     58                               float sysError, ///< Relative systematic error
     59                               psImageMaskType maskVal, ///< Value to mask for input
     60                               psImageMaskType maskBad, ///< Mask for output bad pixels
     61                               psImageMaskType maskPoor, ///< Mask for output poor pixels
     62                               float poorFrac, ///< Fraction for "poor"
     63                               float badFrac ///< Maximum fraction of bad input pixels to accept
     64    );
     65
    5066/// Execute a thread job to measure the PSF width ratios
    5167bool pmSubtractionOrderThread(psThreadJob *job ///< Job to execute
Note: See TracChangeset for help on using the changeset viewer.