IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 14776


Ignore:
Timestamp:
Sep 7, 2007, 10:21:53 AM (19 years ago)
Author:
magnier
Message:

more work on making interpolation happy

Location:
branches/eam_branch_20070830/psLib/src/imageops
Files:
2 edited

Legend:

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

    r14726 r14776  
    1111 *  @author Eugene Magnier, IfA
    1212 *
    13  *  @version $Revision: 1.1.2.5 $ $Name: not supported by cvs2svn $
    14  *  @date $Date: 2007-09-03 20:29:07 $
     13 *  @version $Revision: 1.1.2.6 $ $Name: not supported by cvs2svn $
     14 *  @date $Date: 2007-09-07 20:21:51 $
    1515 *
    1616 *  Copyright 2007 Institute for Astronomy, University of Hawaii
     
    3838#include "psImageInterpolate.h"
    3939#include "psImagePixelInterpolate.h"
     40
     41#include "psFits.h"
     42#include "psFitsImage.h"
    4043
    4144# define PS_IMAGE_ITER_STATE(XS,XE,YS,YE,N_MIN,TYPE) \
     
    7578        for (int ix = 0; ix < mask->numCols; ix++) {
    7679
    77             // skip the good pixels (unmasked)
    78             if (!(mask->data.PS_TYPE_MASK_DATA[iy][ix] & maskVal)) { continue; }
     80            // state of the good pixels (unmasked)
     81            if (!(mask->data.PS_TYPE_MASK_DATA[iy][ix] & maskVal)) {
     82                // count good neighbor pixels (+ self)
     83                int nGood = 0;
     84                int minX = +1;
     85                int maxX = -1;
     86                int minY = +1;
     87                int maxY = -1;
     88                for (int jy = -1; jy <= +1; jy++) {
     89                    /* stick to pixels in image grid */
     90                    if (jy + iy < 0) { continue; }
     91                    if (jy + iy >= mask->numRows) { continue; }
     92                    for (int jx = -1; jx <= +1; jx++) {
     93                        /* stick to pixels in image grid */
     94                        if (jx + ix < 0) { continue; }
     95                        if (jx + ix >= mask->numCols) { continue; }
     96                        if (mask->data.PS_TYPE_MASK_DATA[iy+jy][ix+jx] & maskVal) { continue; }
     97                        nGood ++;
     98                        minX = PS_MIN (minX, jx);
     99                        maxX = PS_MAX (maxX, jx);
     100                        minY = PS_MIN (minY, jy);
     101                        maxY = PS_MAX (maxY, jy);
     102                    }
     103                }
     104                int dX = maxX - minX;
     105                int dY = maxY - minY;
     106                // what type of local interpolation can we use?
     107                if ((nGood >= 6) && (dX == 2) && (dY == 2)) {
     108                    result->data.S32[iy][ix] = PS_IMAGE_INTERPOLATE_GOOD2;
     109                    continue;
     110                }
     111                if (nGood >= 3) {
     112                    result->data.S32[iy][ix] = PS_IMAGE_INTERPOLATE_GOOD1;
     113                    continue;
     114                }
     115                result->data.S32[iy][ix] = PS_IMAGE_INTERPOLATE_GOOD0;
     116                continue;
     117            }
    79118
    80119            // examine the neighbors.  If at least 6 of the 8 surrounding, or 3 of the 4 corner
     
    85124            // check for poor pixels
    86125            PS_IMAGE_ITER_STATE (-1,+1,-1,+1,6, PS_IMAGE_INTERPOLATE_CENTER);
    87             PS_IMAGE_ITER_STATE (-1,+0,-1,+0,3, PS_IMAGE_INTERPOLATE_LL);
    88             PS_IMAGE_ITER_STATE (-1,+0,+0,+1,3, PS_IMAGE_INTERPOLATE_UL);
    89             PS_IMAGE_ITER_STATE (+0,+1,-1,+0,3, PS_IMAGE_INTERPOLATE_LR);
    90             PS_IMAGE_ITER_STATE (+0,+1,+0,+1,3, PS_IMAGE_INTERPOLATE_UR);
     126            PS_IMAGE_ITER_STATE (-1,+0,-1,+0,3, PS_IMAGE_INTERPOLATE_UR);
     127            PS_IMAGE_ITER_STATE (-1,+0,+0,+1,3, PS_IMAGE_INTERPOLATE_LR);
     128            PS_IMAGE_ITER_STATE (+0,+1,-1,+0,3, PS_IMAGE_INTERPOLATE_UL);
     129            PS_IMAGE_ITER_STATE (+0,+1,+0,+1,3, PS_IMAGE_INTERPOLATE_LL);
    91130
    92131            nBad ++;
     
    122161
    123162            switch (state->data.S32[iy][ix]) {
    124               case PS_IMAGE_INTERPOLATE_GOOD:
     163              case PS_IMAGE_INTERPOLATE_GOOD0:
     164              case PS_IMAGE_INTERPOLATE_GOOD1:
     165              case PS_IMAGE_INTERPOLATE_GOOD2:
    125166                // skip the good pixels
    126167                break;
     
    167208              case PS_IMAGE_INTERPOLATE_LL: {
    168209                  // fit a plane to the 3 pixels at (0,1),(1,0),(1,1), extend to pixel at (0,0)
    169                   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];
     210                  image->data.F32[iy][ix] = image->data.F32[iy+1][ix+1] - image->data.F32[iy+0][ix+1] - image->data.F32[iy+1][ix+0];
    170211                  break; }
    171212
    172213              case PS_IMAGE_INTERPOLATE_LR: {
    173214                  // fit a plane to the 3 pixels at (0,1),(-1,0),(-1,1), extend to pixel at (0,0)
    174                   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];
     215                  image->data.F32[iy][ix] = image->data.F32[iy+1][ix-1] - image->data.F32[iy+0][ix-1] - image->data.F32[iy+1][ix+0];
    175216                  break; }
    176217
    177218              case PS_IMAGE_INTERPOLATE_UL: {
    178219                  // fit a plane to the 3 pixels at (0,-1),(1,0),(1,-1), extend to pixel at (0,0)
    179                   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];
     220                  image->data.F32[iy][ix] = image->data.F32[iy-1][ix+1] - image->data.F32[iy+0][ix+1] - image->data.F32[iy-1][ix+0];
    180221                  break; }
    181222
    182223              case PS_IMAGE_INTERPOLATE_UR: {
    183224                  // fit a plane to the 3 pixels at (0,-1),(-1,0),(-1,-1), extend to pixel at (0,0)
    184                   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];
     225                  image->data.F32[iy][ix] = image->data.F32[iy-1][ix-1] - image->data.F32[iy+0][ix-1] - image->data.F32[iy-1][ix+0];
    185226                  break; }
    186227
     
    207248    assert (value->numRows == mask->numRows);
    208249
     250# if (0)
     251    psFits *fits = NULL;
     252
     253    fits = psFitsOpen ("xcoords.fits", "w");
     254    psFitsWriteImage (fits, NULL, xCoord, 0, NULL);
     255    psFitsClose (fits);
     256
     257    fits = psFitsOpen ("ycoords.fits", "w");
     258    psFitsWriteImage (fits, NULL, yCoord, 0, NULL);
     259    psFitsClose (fits);
     260
     261    fits = psFitsOpen ("value.fits", "w");
     262    psFitsWriteImage (fits, NULL, value, 0, NULL);
     263    psFitsClose (fits);
     264# endif
     265
    209266    psImage *output = psImageAlloc (value->numCols, value->numRows, PS_TYPE_F32);
    210267
     
    217274
    218275    // allocate a 2D polynomial to fit a quadratic to the valid neighbor pixels.
    219     psPolynomial2D *poly2D = psPolynomial2DAlloc (PS_POLYNOMIAL_ORD, 2, 2);
    220     poly2D->mask[2][2] = 1;
    221     poly2D->mask[2][1] = 1;
    222     poly2D->mask[1][2] = 1;
     276    psPolynomial2D *poly2o = psPolynomial2DAlloc (PS_POLYNOMIAL_ORD, 2, 2);
     277    poly2o->mask[2][2] = 1;
     278    poly2o->mask[2][1] = 1;
     279    poly2o->mask[1][2] = 1;
    223280
    224281    // allocate a 2D polynomial to fit a plane to the valid neighbor pixels.
    225     psPolynomial2D *poly1D = psPolynomial2DAlloc (PS_POLYNOMIAL_ORD, 1, 1);
    226     poly2D->mask[1][1] = 1;
     282    psPolynomial2D *poly1o = psPolynomial2DAlloc (PS_POLYNOMIAL_ORD, 1, 1);
     283    poly2o->mask[1][1] = 1;
    227284
    228285    for (int iy = 0; iy < state->numRows; iy++) {
     
    256313                  // df->n = n;
    257314                  // psVectorFitPolynomial2D (poly, NULL, 0xff, f, df, x, y);
    258                   psVectorFitPolynomial2D (poly2D, NULL, 0xff, f, NULL, x, y);
     315                  psVectorFitPolynomial2D (poly2o, NULL, 0xff, f, NULL, x, y);
    259316                  // apply the fitted quadratic to get the poor pixel value
    260                   output->data.F32[iy][ix] = psPolynomial2DEval (poly2D, ix, iy);
     317                  // center of pixel is 0.5,0.5
     318                  output->data.F32[iy][ix] = psPolynomial2DEval (poly2o, ix + 0.5, iy + 0.5);
    261319                  break; }
    262320
     
    286344                  f->n = n;
    287345                  // df->n = n;
    288                   // psVectorFitPolynomial2D (poly1D, NULL, 0xff, f, df, x, y);
    289                   psVectorFitPolynomial2D (poly1D, NULL, 0xff, f, NULL, x, y);
     346                  // psVectorFitPolynomial2D (poly1o, NULL, 0xff, f, df, x, y);
     347                  psVectorFitPolynomial2D (poly1o, NULL, 0xff, f, NULL, x, y);
    290348                  // apply the fitted quadratic to get the poor pixel value
    291                   output->data.F32[iy][ix] = psPolynomial2DEval (poly1D, ix, iy);
     349                  output->data.F32[iy][ix] = psPolynomial2DEval (poly1o, ix + 0.5, iy + 0.5);
    292350                  break; }
    293351
    294352              case PS_IMAGE_INTERPOLATE_GOOD0: {
    295                   output->data.F32[iy][ix] = value->data.F32[iy+jy][ix+jx];
     353                  output->data.F32[iy][ix] = value->data.F32[iy][ix];
    296354                  break; }
    297355
    298356              default:
    299                 psAbort("impossible case in __func__");
     357                // skip poor or bad pixels (interpolate later)
     358                break;
    300359            }
    301360        }           
     
    313372    psFree (f);
    314373
    315     psFree (poly2D);
    316     psFree (poly1D);
     374    psFree (poly2o);
     375    psFree (poly1o);
    317376
    318377    psFree (output);
  • branches/eam_branch_20070830/psLib/src/imageops/psImagePixelInterpolate.h

    r14725 r14776  
    77 *  @author Eugene Magnier, IfA
    88 *
    9  *  @version $Revision: 1.1.2.2 $ $Name: not supported by cvs2svn $
    10  *  @date $Date: 2007-09-02 20:29:50 $
     9 *  @version $Revision: 1.1.2.3 $ $Name: not supported by cvs2svn $
     10 *  @date $Date: 2007-09-07 20:21:53 $
    1111 *
    1212 *  Copyright 2007 Institute for Astronomy, University of Hawaii
     
    2121// XXX make these all bit values?
    2222typedef enum {
    23     PS_IMAGE_INTERPOLATE_GOOD   = 0x00,
     23    PS_IMAGE_INTERPOLATE_GOOD   = 0x10,
     24    PS_IMAGE_INTERPOLATE_GOOD0  = 0x11,
     25    PS_IMAGE_INTERPOLATE_GOOD1  = 0x12,
     26    PS_IMAGE_INTERPOLATE_GOOD2  = 0x13,
    2427    PS_IMAGE_INTERPOLATE_BAD    = 0x01,
    2528    PS_IMAGE_INTERPOLATE_CENTER = 0x02,
     
    3336psImage *psImagePixelInterpolateState (int *nBad, int *nPoor, psImage *mask, psMaskType maskVal);
    3437bool psImagePixelInterpolatePoor (psImage *image, psImage *state, psImage *mask, psMaskType maskVal);
     38bool psImagePixelInterpolateCenter (psImage *value, psImage *xCoord, psImage *yCoord, psImage *state, psImage *mask, psMaskType maskVal);
    3539
    3640/// @}
Note: See TracChangeset for help on using the changeset viewer.