IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 12802 for trunk/psLib


Ignore:
Timestamp:
Apr 11, 2007, 9:54:47 AM (19 years ago)
Author:
Paul Price
Message:

It's not the flux contribution of bad pixels that matters for marking
a pixel as "poor" or "bad", but the kernel contribution relative to
the total kernel.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/psLib/src/imageops/psImageInterpolate.c

    r12776 r12802  
    77 *  @author Paul Price, IfA
    88 *
    9  *  @version $Revision: 1.3 $ $Name: not supported by cvs2svn $
    10  *  @date $Date: 2007-04-10 03:59:13 $
     9 *  @version $Revision: 1.4 $ $Name: not supported by cvs2svn $
     10 *  @date $Date: 2007-04-11 19:54:47 $
    1111 *
    1212 *  Copyright 2004-2007 Institute for Astronomy, University of Hawaii
     
    236236            for (int j = 0, yPix = yCentral - (yNum - 1) / 2; j < yNum; j++, yPix++) { \
    237237                for (int i = 0, xPix = xCentral - (xNum - 1) / 2; i < xNum; i++, xPix++) { \
    238                     value += values[j][i] = kernel[j][i] * image->data.TYPE[yPix][xPix]; \
     238                    *imageValue += kernel[j][i] * image->data.TYPE[yPix][xPix]; \
    239239                } \
    240240            } \
     
    243243
    244244    // Calculate the value for the image
    245     double value = 0.0;                 // Value to return
    246     double values[yNum][xNum];          // Values in image
    247     switch (image->type.type) {
    248         KERNEL_IMAGE_CASE(U8);
    249         KERNEL_IMAGE_CASE(U16);
    250         KERNEL_IMAGE_CASE(U32);
    251         KERNEL_IMAGE_CASE(U64);
    252         KERNEL_IMAGE_CASE(S8);
    253         KERNEL_IMAGE_CASE(S16);
    254         KERNEL_IMAGE_CASE(S32);
    255         KERNEL_IMAGE_CASE(S64);
    256         KERNEL_IMAGE_CASE(F32);
    257         KERNEL_IMAGE_CASE(F64);
    258       default:
    259         psError(PS_ERR_BAD_PARAMETER_TYPE, true, "Unrecognised type for image: %x",
    260                 image->type.type);
    261         return false;
    262     }
    263245    if (imageValue) {
    264         *imageValue = value;
     246        *imageValue = 0.0;
     247        switch (image->type.type) {
     248            KERNEL_IMAGE_CASE(U8);
     249            KERNEL_IMAGE_CASE(U16);
     250            KERNEL_IMAGE_CASE(U32);
     251            KERNEL_IMAGE_CASE(U64);
     252            KERNEL_IMAGE_CASE(S8);
     253            KERNEL_IMAGE_CASE(S16);
     254            KERNEL_IMAGE_CASE(S32);
     255            KERNEL_IMAGE_CASE(S64);
     256            KERNEL_IMAGE_CASE(F32);
     257            KERNEL_IMAGE_CASE(F64);
     258          default:
     259            psError(PS_ERR_BAD_PARAMETER_TYPE, true, "Unrecognised type for image: %x",
     260                    image->type.type);
     261            return false;
     262        }
    265263    }
    266264
     
    268266    const psImage *mask = options->mask; // Image mask
    269267    if (maskValue && mask) {
     268        *maskValue = 0;
    270269        psMaskType maskVal = options->maskVal; // Mask value
    271         double badValue = 0.0;          // Amount of flux in bad pixels
    272         int badPix = 0;                 // Number of bad pixels
    273         *maskValue = 0;
     270        double badContrib = 0.0;        // Amount of kernel on bad pixels
     271        double totContrib = 0.0;        // Total amount of kernel
     272        bool badPix = false;            // Is there a bad pixel?
    274273        for (int j = 0, yPix = yCentral - (yNum - 1) / 2; j < yNum; j++, yPix++) {
    275274            for (int i = 0, xPix = xCentral - (xNum - 1) / 2; i < xNum; i++, xPix++) {
    276275                if (mask->data.PS_TYPE_MASK_DATA[yPix][xPix] & maskVal) {
    277                     badValue += values[j][i];
    278                     badPix++;
     276                    badContrib += fabs(kernel[j][i]);
     277                    badPix = true;
    279278                }
    280279                *maskValue |= mask->data.PS_TYPE_MASK_DATA[yPix][xPix];
     280                totContrib += fabs(kernel[j][i]);
    281281            }
    282282        }
    283283
    284         if (badPix > 0) {
    285             if (fabs(badValue) >= fabs(value) * options->poorFrac) {
     284        if (badPix) {
     285            if (badContrib / totContrib >= options->poorFrac) {
    286286                *maskValue |= options->badMask;
    287287            } else {
     
    453453            double xInterpValue = 0.0; /* Interpolation in x */ \
    454454            for (int i = 0, xPix = xCentral - (xNum - 1) / 2; i < xNum; i++, xPix++) { \
    455                 xInterpValue += values[j][i] = xKernel[i] * image->data.TYPE[yPix][xPix]; \
     455                xInterpValue += xKernel[i] * image->data.TYPE[yPix][xPix]; \
    456456            } \
    457             value += yKernel[j] * xInterpValue; /* Interpolating in y */ \
     457            *imageValue += yKernel[j] * xInterpValue; /* Interpolating in y */ \
    458458        } \
    459459        break; \
     
    461461
    462462    // Calculate the value for the image
    463     double value = 0.0;                 // Value to return
    464     double values[yNum][xNum];          // Values of interest
    465     switch (image->type.type) {
    466         SEPARATE_IMAGE_CASE(U8);
    467         SEPARATE_IMAGE_CASE(U16);
    468         SEPARATE_IMAGE_CASE(U32);
    469         SEPARATE_IMAGE_CASE(U64);
    470         SEPARATE_IMAGE_CASE(S8);
    471         SEPARATE_IMAGE_CASE(S16);
    472         SEPARATE_IMAGE_CASE(S32);
    473         SEPARATE_IMAGE_CASE(S64);
    474         SEPARATE_IMAGE_CASE(F32);
    475         SEPARATE_IMAGE_CASE(F64);
    476       default:
    477         psError(PS_ERR_BAD_PARAMETER_TYPE, true, "Unrecognised type for image: %x",
    478                 image->type.type);
    479         return false;
    480     }
    481463    if (imageValue) {
    482         *imageValue = value;
     464        *imageValue = 0.0;
     465        switch (image->type.type) {
     466            SEPARATE_IMAGE_CASE(U8);
     467            SEPARATE_IMAGE_CASE(U16);
     468            SEPARATE_IMAGE_CASE(U32);
     469            SEPARATE_IMAGE_CASE(U64);
     470            SEPARATE_IMAGE_CASE(S8);
     471            SEPARATE_IMAGE_CASE(S16);
     472            SEPARATE_IMAGE_CASE(S32);
     473            SEPARATE_IMAGE_CASE(S64);
     474            SEPARATE_IMAGE_CASE(F32);
     475            SEPARATE_IMAGE_CASE(F64);
     476          default:
     477            psError(PS_ERR_BAD_PARAMETER_TYPE, true, "Unrecognised type for image: %x",
     478                    image->type.type);
     479            return false;
     480        }
    483481    }
    484482
     
    487485    if (maskValue && mask) {
    488486        psMaskType maskVal = options->maskVal; // Mask value
    489         double badValue = 0.0;          // Amount of flux in bad pixels
    490         int badPix = 0;                 // Number of bad pixels
     487        double badContrib = 0.0;        // Amount of kernel on bad pixels
     488        double totContrib = 0.0;        // Total amount of kernel
     489        bool badPix = false;            // Number of bad pixels
    491490        *maskValue = 0;
    492491        for (int j = 0, yPix = yCentral - (yNum - 1) / 2; j < yNum; j++, yPix++) {
    493492            // Interpolation in x
    494             double xInterpValue = 0.0;
     493            double xBadContrib = 0.0;   // Amount of x kernel on bad pixels
     494            double xTotContrib = 0.0;   // Total amount of x kernel
    495495            for (int i = 0, xPix = xCentral - (xNum - 1) / 2; i < xNum; i++, xPix++) {
    496496                if (mask->data.PS_TYPE_MASK_DATA[yPix][xPix] & maskVal) {
    497                     xInterpValue += values[j][i];
    498                     badPix++;
     497                    xBadContrib += fabs(xKernel[i]);
     498                    badPix = true;
    499499                }
    500500                *maskValue |= mask->data.PS_TYPE_MASK_DATA[yPix][xPix];
     501                xTotContrib += fabs(xKernel[i]);
    501502            }
    502503            // Interpolating in y
    503             badValue += yKernel[j] * xInterpValue;
    504         }
    505 
    506         if (badPix > 0) {
    507             if (fabs(badValue) >= fabs(value) * options->poorFrac) {
     504            badContrib += fabs(yKernel[j]) * xBadContrib;
     505            totContrib += fabs(yKernel[j]) * xTotContrib;
     506        }
     507
     508        if (badPix) {
     509            if (badContrib / totContrib >= options->poorFrac) {
    508510                *maskValue |= options->badMask;
    509511            } else {
Note: See TracChangeset for help on using the changeset viewer.