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/pmSubtractionMask.c

    r27086 r27365  
    4242                           pmSubtractionMode mode)
    4343{
    44     PM_ASSERT_READOUT_NON_NULL(ro1, NULL);
    45     PM_ASSERT_READOUT_IMAGE(ro1, NULL);
    46     PM_ASSERT_READOUT_MASK(ro1, NULL);
    47     PM_ASSERT_READOUT_NON_NULL(ro2, NULL);
    48     PM_ASSERT_READOUT_IMAGE(ro2, NULL);
    49     PM_ASSERT_READOUT_MASK(ro2, NULL);
    50     PS_ASSERT_IMAGES_SIZE_EQUAL(ro1->image, ro2->image, NULL);
     44    int numCols = 0, numRows = 0;       // Size of the images
     45    if (ro1) {
     46        PM_ASSERT_READOUT_NON_NULL(ro1, NULL);
     47        PM_ASSERT_READOUT_IMAGE(ro1, NULL);
     48        PM_ASSERT_READOUT_MASK(ro1, NULL);
     49        numCols = ro1->image->numCols;
     50        numRows = ro1->image->numRows;
     51            }
     52    if (ro2) {
     53        PM_ASSERT_READOUT_NON_NULL(ro2, NULL);
     54        PM_ASSERT_READOUT_IMAGE(ro2, NULL);
     55        PM_ASSERT_READOUT_MASK(ro2, NULL);
     56        numCols = ro2->image->numCols;
     57        numRows = ro2->image->numRows;
     58    }
     59    if (ro1 && ro2) {
     60        PS_ASSERT_IMAGES_SIZE_EQUAL(ro1->image, ro2->image, NULL);
     61    }
     62    if (!ro1 && !ro2) {
     63        psError(PS_ERR_UNEXPECTED_NULL, true, "No image provided.");
     64        return false;
     65    }
     66    psAssert(numCols > 0 && numRows > 0, "There should be an image provided");
    5167    PS_ASSERT_INT_NONNEGATIVE(size, NULL);
    5268    PS_ASSERT_INT_NONNEGATIVE(footprint, NULL);
     
    5672    }
    5773
    58     int numCols = ro1->image->numCols, numRows = ro1->image->numRows; // Size of the images
    59 
    6074    // Dereference inputs for convenience
    61     psF32 **imageData1 = ro1->image->data.F32, **imageData2 = ro2->image->data.F32;
    62     psImageMaskType **maskData1 = ro1->mask->data.PS_TYPE_IMAGE_MASK_DATA,
    63         **maskData2 = ro2->mask->data.PS_TYPE_IMAGE_MASK_DATA;
     75    psF32 **imageData1 = ro1 ? ro1->image->data.F32 : NULL;
     76    psF32 **imageData2 = ro2 ? ro2->image->data.F32 : NULL;
     77    psImageMaskType **maskData1 = ro1 ? ro1->mask->data.PS_TYPE_IMAGE_MASK_DATA : NULL;
     78    psImageMaskType **maskData2 = ro2 ? ro2->mask->data.PS_TYPE_IMAGE_MASK_DATA : NULL;
    6479
    6580    // First, a pass through to determine the fraction of bad pixels
     
    6984        for (int y = 0; y < numRows; y++) {
    7085            for (int x = 0; x < numCols; x++) {
    71                 if ((maskData1[y][x] & maskVal) || !isfinite(imageData1[y][x])) {
     86                if (ro1 && ((maskData1[y][x] & maskVal) || !isfinite(imageData1[y][x]))) {
    7287                    numBad++;
    7388                    continue;
    7489                }
    75                 if ((maskData2[y][x] & maskVal) || !isfinite(imageData2[y][x])) {
     90                if (ro2 && ((maskData2[y][x] & maskVal) || !isfinite(imageData2[y][x]))) {
    7691                    numBad++;
    7792                    continue;
     
    128143    for (int y = 0; y < numRows; y++) {
    129144        for (int x = 0; x < numCols; x++) {
    130             if (maskData1[y][x] & maskVal) {
     145            if (ro1 && maskData1[y][x] & maskVal) {
    131146                maskData[y][x] |= PM_SUBTRACTION_MASK_BAD_1;
    132147            }
    133             if (maskData2[y][x] & maskVal) {
     148            if (ro2 && maskData2[y][x] & maskVal) {
    134149                maskData[y][x] |= PM_SUBTRACTION_MASK_BAD_2;
    135150            }
     
    144159
    145160    // Pixels that will be bad (or poor) if we convolve with a bad reference pixel
    146     if (!psImageConvolveMask(mask, mask, PM_SUBTRACTION_MASK_BAD_1, PM_SUBTRACTION_MASK_CONVOLVE_1,
    147                              -size, size, -size, size)) {
     161    if (ro1 && !psImageConvolveMask(mask, mask, PM_SUBTRACTION_MASK_BAD_1, PM_SUBTRACTION_MASK_CONVOLVE_1,
     162                                    -size, size, -size, size)) {
    148163        psError(psErrorCodeLast(), false, "Unable to convolve bad pixels from mask 1.");
    149164        psFree(mask);
    150165        return NULL;
    151166    }
    152     if (!psImageConvolveMask(mask, mask, PM_SUBTRACTION_MASK_BAD_2, PM_SUBTRACTION_MASK_CONVOLVE_2,
    153                              -size, size, -size, size)) {
     167    if (ro2 && !psImageConvolveMask(mask, mask, PM_SUBTRACTION_MASK_BAD_2, PM_SUBTRACTION_MASK_CONVOLVE_2,
     168                                    -size, size, -size, size)) {
    154169        psError(psErrorCodeLast(), false, "Unable to convolve bad pixels from mask 2.");
    155170        psFree(mask);
     
    174189        psAbort("Unsupported subtraction mode: %x", mode);
    175190    }
    176     if (!psImageConvolveMask(mask, mask, maskRej, PM_SUBTRACTION_MASK_REJ,
    177                              -footprint, footprint, -footprint, footprint)) {
     191    if (ro1 && ro2 && !psImageConvolveMask(mask, mask, maskRej, PM_SUBTRACTION_MASK_REJ,
     192                                           -footprint, footprint, -footprint, footprint)) {
    178193        psError(psErrorCodeLast(), false, "Unable to convolve bad pixels.");
    179194        psFree(mask);
Note: See TracChangeset for help on using the changeset viewer.