IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 20325


Ignore:
Timestamp:
Oct 22, 2008, 8:40:36 AM (18 years ago)
Author:
Paul Price
Message:

Fix interpolation with separable kernels:

  • sumKernel2 is now for the entire kernel, not just the good pixels.
  • was using the wrong values of the kernel when near the edge
  • was using the wrong kernelValue in one case
  • can optimise bad contributions since kernel2 sums are known
File:
1 edited

Legend:

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

    r20317 r20325  
    77 *  @author Paul Price, IfA
    88 *
    9  *  @version $Revision: 1.27 $ $Name: not supported by cvs2svn $
    10  *  @date $Date: 2008-10-22 03:53:10 $
     9 *  @version $Revision: 1.28 $ $Name: not supported by cvs2svn $
     10 *  @date $Date: 2008-10-22 18:40:36 $
    1111 *
    1212 *  Copyright 2004-2007 Institute for Astronomy, University of Hawaii
     
    429429    *imageValue = sumImage / sumKernel; \
    430430    if (wantVariance) { \
    431         *varianceValue = sumVariance / sumKernel2; \
     431        *varianceValue = sumVariance / (sumKernel2 - sumBad); \
    432432    } \
    433433    if (sumBad == 0) { \
    434434        /* Completely good pixel */ \
    435435        status = PS_INTERPOLATE_STATUS_GOOD; \
    436     } else if (sumBad < PS_SQR(interp->poorFrac) * (sumBad + sumKernel2) ) { \
     436    } else if (sumBad < PS_SQR(interp->poorFrac) * sumKernel2) { \
    437437        /* Some pixels masked: poor pixel */ \
    438438        if (haveMask && maskValue) { \
     
    535535
    536536    if (offImage) {
    537     // Add contributions in an area outside the image
    538 #define INTERPOLATE_SEPARATE_SETUP_OFFIMAGE_COL() \
    539     float xSumBad = 0.0;
    540 #define INTERPOLATE_SEPARATE_ADD_OFFIMAGE_COL() { \
    541         xSumBad += xKernel2[i]; \
    542     }
    543 #define INTERPOLATE_SEPARATE_ADD_OFFIMAGE_ROW() { \
    544         sumBad += yKernel2[j] * xSumBad; \
    545     }
    546 
    547537        // Bottom rows
    548         if (!yExact) {
    549             for (int j = 0; j < jMin; j++) {
    550                 INTERPOLATE_SEPARATE_SETUP_OFFIMAGE_COL();
    551                 for (int i = 0; i < size; i++) {
    552                     INTERPOLATE_SEPARATE_ADD_OFFIMAGE_COL();
    553                 }
    554                 INTERPOLATE_SEPARATE_ADD_OFFIMAGE_ROW();
     538        for (int j = 0; j < jMin; j++) {
     539            sumBad += yKernel2[j] * xSumKernel2;
     540        }
     541        // Two sides
     542        for (int j = jMin; j < jMax; j++) {
     543            float xSumBad = 0.0;
     544            for (int i = 0; i < iMin; i++) {
     545                xSumBad += xKernel2[i];
    555546            }
    556         }
    557         // Two sides
    558         if (!xExact) {
    559             for (int j = jMin; j < jMax; j++) {
    560                 INTERPOLATE_SEPARATE_SETUP_OFFIMAGE_COL();
    561                 for (int i = 0; i < iMin; i++) {
    562                     INTERPOLATE_SEPARATE_ADD_OFFIMAGE_COL();
    563                 }
    564                 for (int i = iMax; i < size; i++) {
    565                     INTERPOLATE_SEPARATE_ADD_OFFIMAGE_COL();
    566                 }
    567                 INTERPOLATE_SEPARATE_ADD_OFFIMAGE_ROW();
     547            for (int i = iMax; i < size; i++) {
     548                xSumBad += xKernel2[i];
    568549            }
     550            sumBad += ySumKernel2 * xSumBad;
    569551        }
    570552        // Top rows
    571         if (!yExact) {
    572             for (int j = jMax; j < size; j++) {
    573                 if (!xExact) {
    574                     INTERPOLATE_SEPARATE_SETUP_OFFIMAGE_COL();
    575                     for (int i = 0; i < size; i++) {
    576                         INTERPOLATE_SEPARATE_ADD_OFFIMAGE_COL();
    577                     }
    578                     INTERPOLATE_SEPARATE_ADD_OFFIMAGE_ROW();
    579                 }
    580             }
    581         }
    582     }
     553        for (int j = jMax; j < size; j++) {
     554            sumBad += yKernel2[j] * xSumKernel2;
     555        }
     556    }
     557
     558    yKernel += jMin;
     559    yKernel2 += jMin;
     560    xKernel += iMin;
     561    xKernel2 += iMin;
    583562
    584563#define INTERPOLATE_SEPARATE_CASE(TYPE) \
     
    600579                  const psF32 *xKernelData = xKernel; \
    601580                  const psF32 *xKernel2Data = xKernel2; \
    602                   for (int i = iMin, xPix = xMin; i < iMax; \
    603                            i++, xPix++, imageData++, varianceData++, maskData++, \
    604                            xKernelData++, xKernel2Data++) { \
     581                  for (int i = iMin; i < iMax; i++, imageData++, varianceData++, maskData++, \
     582                                               xKernelData++, xKernel2Data++) { \
    605583                      float kernelValue = *xKernelData; /* Value of kernel in x */ \
    606584                      float kernelValue2 = *xKernel2Data; /* Square of kernel in x */ \
     
    613591                      } \
    614592                  } \
    615                   float kernelValue = *yKernel; /* Value of kernel in y */ \
     593                  float kernelValue = *yKernelData; /* Value of kernel in y */ \
    616594                  float kernelValue2 = *yKernel2Data; /* Value of kernel-squared in y */ \
    617595                  sumImage += kernelValue * xSumImage; \
     
    633611                  const psF32 *xKernelData = xKernel; \
    634612                  const psF32 *xKernel2Data = xKernel2; \
    635                   for (int i = iMin, xPix = xMin; i < iMax; \
    636                            i++, xPix++, imageData++, varianceData++, xKernelData++, xKernel2Data++) { \
     613                  for (int i = iMin; i < iMax; i++, imageData++, varianceData++, \
     614                                               xKernelData++, xKernel2Data++) { \
    637615                      float kernelValue = *xKernelData; /* Value of kernel */ \
    638616                      float kernelValue2 = *xKernel2Data; /* Square of kernel */ \
     
    661639              const psF32 *xKernelData = xKernel; \
    662640              const psF32 *xKernel2Data = xKernel2; \
    663               for (int i = iMin, xPix = xMin; i < iMax; \
    664                        i++, xPix++, imageData++, maskData++, xKernelData++, xKernel2Data++) { \
     641              for (int i = iMin; i < iMax; i++, imageData++, maskData++, xKernelData++, xKernel2Data++) { \
    665642                  float kernelValue = *xKernelData; /* Value of kernel */ \
    666643                  float kernelValue2 = *xKernel2Data; /* Value of kernel-squared */ \
     
    687664              const ps##TYPE *imageData = &image->data.TYPE[yPix][xMin]; \
    688665              const psF32 *xKernelData = xKernel; \
    689               for (int i = iMin, xPix = xMin; i < iMax; i++, xPix++, imageData++, xKernelData++) { \
     666              for (int i = iMin; i < iMax; i++, imageData++, xKernelData++) { \
    690667                  float kernelValue = *xKernelData; /* Value of kernel */ \
    691668                  xSumImage += kernelValue * *imageData; \
Note: See TracChangeset for help on using the changeset viewer.