IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 14724


Ignore:
Timestamp:
Sep 1, 2007, 4:42:55 PM (19 years ago)
Author:
magnier
Message:

working on interpolation

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/eam_branch_20070830/psLib/src/imageops/psImagePixelInterpolate.c

    r14723 r14724  
    1111 *  @author Eugene Magnier, IfA
    1212 *
    13  *  @version $Revision: 1.1.2.2 $ $Name: not supported by cvs2svn $
    14  *  @date $Date: 2007-09-02 02:03:58 $
     13 *  @version $Revision: 1.1.2.3 $ $Name: not supported by cvs2svn $
     14 *  @date $Date: 2007-09-02 02:42:55 $
    1515 *
    1616 *  Copyright 2007 Institute for Astronomy, University of Hawaii
     
    3434#include "psPolynomial.h"
    3535#include "psPolynomialUtils.h"
     36#include "psMinimizePolyFit.h"
    3637#include "psImage.h"
    3738#include "psImageInterpolate.h"
     
    4950                    if (jx + ix >= mask->numCols) { continue; } \
    5051                    /* do not test self */ \
    51                     if (!jx && jy) { continue; } \
    52                     if (mask->data.PS_TYPE_MASK_DATA[iy][ix] & maskVal) { continue; } \
     52                    if (!jx && !jy) { continue; } \
     53                    if (mask->data.PS_TYPE_MASK_DATA[iy+jy][ix+jx] & maskVal) { continue; } \
    5354                    nGood ++; \
    5455                } \
     
    115116                  // fit a quadratic to the valid neighbor pixels
    116117                  // apply the quadratic to get the poor pixel value
    117                   psPolynomial2D *poly = psImageBicubeFit (image, mask, maskVal, ix, iy);
     118                  psPolynomial2D *poly = psPolynomial2DAlloc (PS_POLYNOMIAL_ORD, 2, 2);
     119                  poly->mask[2][2] = 1;
     120                  poly->mask[2][1] = 1;
     121                  poly->mask[1][2] = 1;
     122                  psVector *f = psVectorAlloc (9, PS_TYPE_F32);
     123                  psVector *df = psVectorAlloc (9, PS_TYPE_F32);
     124                  psVector *x = psVectorAlloc (9, PS_TYPE_F32);
     125                  psVector *y = psVectorAlloc (9, PS_TYPE_F32);
     126
     127                  int n = 0;
     128                  for (int jy = -1; jy <= +1; jy++) {
     129                      // skip invalid pixels (jx < 0, >= Nx), etc
     130                      if (jy + iy < 0) { continue; }
     131                      if (jy + iy >= image->numRows) { continue; }
     132                      for (int jx = -1; jx <= +1; jx++) {
     133                          // skip invalid pixels (jx < 0, >= Nx), etc
     134                          if (jx + ix < 0) { continue; }
     135                          if (jx + ix >= mask->numCols) { continue; }
     136                          /* skip self */
     137                          if (!jx && !jy) { continue; }
     138                          // skip masked pixels
     139                          if (mask->data.PS_TYPE_MASK_DATA[iy+jy][ix+jx] & maskVal) { continue; } \
     140                          f->data.F32[n] = image->data.F32[iy+jy][ix+jx];
     141                          // df->data.F32[n] = weight->data.F32[jy][jx];
     142                          x->data.F32[n] = jx;
     143                          y->data.F32[n] = jy;
     144                          n++;
     145                      }
     146                  }
     147                  // XXX set vector lengths here
     148                  x->n = n;
     149                  y->n = n;
     150                  f->n = n;
     151                  // df->n = n;
     152                  psVectorFitPolynomial2D (poly, mask, maskValue, f, df, x, y);
    118153                  image->data.F32[iy][ix] = poly->coeff[0][0];
    119154                  break; }
    120155
    121156              case PS_IMAGE_INTERPOLATE_LL: {
    122                   // fit a plane to the valid neighbor pixels
    123                   // apply the plane to get the poor pixel value
    124                   psPolynomial2D *poly = psImageBilinearFit (image, mask, maskVal, ix - 1, iy - 1);
    125                   image->data.F32[iy][ix] = poly->coeff[0][0] + poly->coeff[1][0] + poly->coeff[0][1];
     157                  // fit a plane to the 3 pixels at (0,1),(1,0),(1,1), extend to pixel at (0,0)
     158                  image->data.F32[iy][ix] = image->data.F32[iy+1][ix+0] - image->data.F32[iy+0][ix+1] - image->data.F32[iy+1][ix+1];
    126159                  break; }
    127160
    128161              case PS_IMAGE_INTERPOLATE_LR: {
    129                   // fit a plane to the valid neighbor pixels
    130                   // apply the plane to get the poor pixel value
    131                   psPolynomial2D *poly = psImageBilinearFit (image, mask, maskVal, ix - 0, iy - 1);
    132                   image->data.F32[iy][ix] = poly->coeff[0][0] + poly->coeff[0][1];
     162                  // fit a plane to the 3 pixels at (0,1),(-1,0),(-1,1), extend to pixel at (0,0)
     163                  image->data.F32[iy][ix] = image->data.F32[iy+1][ix+0] - image->data.F32[iy+0][ix-1] - image->data.F32[iy+1][ix-1];
    133164                  break; }
    134165
    135166              case PS_IMAGE_INTERPOLATE_UL: {
    136                   // fit a plane to the valid neighbor pixels
    137                   // apply the plane to get the poor pixel value
    138                   psPolynomial2D *poly = psImageBilinearFit (image, mask, maskVal, ix - 1, iy - 0);
    139                   image->data.F32[iy][ix] = poly->coeff[0][0] + poly->coeff[1][0];
     167                  // fit a plane to the 3 pixels at (0,-1),(1,0),(1,-1), extend to pixel at (0,0)
     168                  image->data.F32[iy][ix] = image->data.F32[iy-1][ix+0] - image->data.F32[iy+0][ix+1] - image->data.F32[iy-1][ix+1];
    140169                  break; }
    141170
    142171              case PS_IMAGE_INTERPOLATE_UR: {
    143                   // fit a plane to the valid neighbor pixels
    144                   // apply the plane to get the poor pixel value
    145                   psPolynomial2D *poly = psImageBilinearFit (image, mask, maskVal, ix - 0, iy - 0);
    146                   image->data.F32[iy][ix] = poly->coeff[0][0];
     172                  // fit a plane to the 3 pixels at (0,-1),(-1,0),(-1,-1), extend to pixel at (0,0)
     173                  image->data.F32[iy][ix] = image->data.F32[iy-1][ix+0] - image->data.F32[iy+0][ix-1] - image->data.F32[iy-1][ix-1];
    147174                  break; }
    148175
Note: See TracChangeset for help on using the changeset viewer.