IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Mar 19, 2010, 5:09:20 PM (16 years ago)
Author:
Paul Price
Message:

Adding program ppSubConvolve to convolve an image by the (previously calculated) convolution kernel. Made a small change to the API for initialising PSF-matching (pmSubtraction) threads. pmSubtractionMatchPrecalc now does a quick and dirty background subtraction, just like pmSubtractionMatch does. Changed a few functions to allow one of the input readouts to be NULL.

File:
1 edited

Legend:

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

    r27086 r27365  
    132132    if (subMode != PM_SUBTRACTION_MODE_2) {
    133133        PM_ASSERT_READOUT_NON_NULL(conv1, false);
     134        PM_ASSERT_READOUT_NON_NULL(ro1, false);
     135        PM_ASSERT_READOUT_IMAGE(ro1, false);
    134136        if (conv1->image) {
    135137            psFree(conv1->image);
     
    147149    if (subMode != PM_SUBTRACTION_MODE_1) {
    148150        PM_ASSERT_READOUT_NON_NULL(conv2, false);
     151        PM_ASSERT_READOUT_NON_NULL(ro2, false);
     152        PM_ASSERT_READOUT_IMAGE(ro2, false);
    149153        if (conv2->image) {
    150154            psFree(conv2->image);
     
    161165    }
    162166
    163     PM_ASSERT_READOUT_NON_NULL(ro1, false);
    164     PM_ASSERT_READOUT_NON_NULL(ro2, false);
    165     PM_ASSERT_READOUT_IMAGE(ro1, false);
    166     PM_ASSERT_READOUT_IMAGE(ro2, false);
    167     PS_ASSERT_IMAGES_SIZE_EQUAL(ro1->image, ro2->image, false);
     167    if (ro1 && ro2) {
     168        PS_ASSERT_IMAGES_SIZE_EQUAL(ro1->image, ro2->image, false);
     169    }
    168170    PS_ASSERT_INT_NONNEGATIVE(stride, false);
    169171    if (isfinite(normFrac)) {
     
    379381    }
    380382
     383    int numCols, numRows;       // Size of image
     384    if (ro1) {
     385        numCols = ro1->image->numCols;
     386        numRows = ro1->image->numRows;
     387    } else if (ro2) {
     388        numCols = ro2->image->numCols;
     389        numRows = ro2->image->numRows;
     390    } else {
     391        psAbort("No input image provided.");
     392    }
     393
    381394    pmSubtractionMaskInvalid(ro1, maskVal);
    382395    pmSubtractionMaskInvalid(ro2, maskVal);
     396
     397    // General background subtraction, since this is done in pmSubtractionMatch
     398    {
     399        psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS); // Random number generator
     400        psStats *bg = psStatsAlloc(PS_STAT_ROBUST_MEDIAN); // Statistics for background
     401        if (ro1) {
     402            psStatsInit(bg);
     403            if (!psImageBackground(bg, NULL, ro1->image, ro1->mask, maskVal, rng)) {
     404                psError(PM_ERR_DATA, false, "Unable to measure background statistics.");
     405                psFree(bg);
     406                psFree(rng);
     407                return false;
     408            }
     409            psBinaryOp(ro1->image, ro1->image, "-", psScalarAlloc((float)bg->robustMedian, PS_TYPE_F32));
     410        }
     411        if (ro2) {
     412            psStatsInit(bg);
     413            if (!psImageBackground(bg, NULL, ro2->image, ro2->mask, maskVal, rng)) {
     414                psError(PM_ERR_DATA, false, "Unable to measure background statistics.");
     415                psFree(bg);
     416                psFree(rng);
     417                return false;
     418            }
     419            psBinaryOp(ro2->image, ro2->image, "-", psScalarAlloc((float)bg->robustMedian, PS_TYPE_F32));
     420        }
     421        psFree(bg);
     422        psFree(rng);
     423    }
    383424
    384425    psRegion bounds = psRegionSet(NAN, NAN, NAN, NAN); // Bounds of valid pixels
     
    396437    psMetadata *outHeader = psMetadataAlloc(); // Output header values
    397438
    398     int numCols = ro1->image->numCols, numRows = ro1->image->numRows; // Size of image
    399439    subtractionMatchAlloc(conv1, conv2, ro1, ro2, subMask, maskBad, mode, numCols, numRows);
    400440
     
    404444        psRegion *region = regions->data[i]; // Region of interest
    405445
    406         if (!pmSubtractionAnalysis(outAnalysis, outHeader, kernel, region,
    407                                    ro1->image->numCols, ro1->image->numRows)) {
     446        if (!pmSubtractionAnalysis(outAnalysis, outHeader, kernel, region, numCols, numRows)) {
    408447            psError(psErrorCodeLast(), false, "Unable to generate QA data");
    409448            psFree(outAnalysis);
     
    454493        return false;
    455494    }
     495
     496    // We need both inputs
     497    PM_ASSERT_READOUT_NON_NULL(ro1, false);
     498    PM_ASSERT_READOUT_NON_NULL(ro2, false);
    456499
    457500    PS_ASSERT_INT_NONNEGATIVE(footprint, false);
Note: See TracChangeset for help on using the changeset viewer.