Changeset 14776
- Timestamp:
- Sep 7, 2007, 10:21:53 AM (19 years ago)
- Location:
- branches/eam_branch_20070830/psLib/src/imageops
- Files:
-
- 2 edited
-
psImagePixelInterpolate.c (modified) (11 diffs)
-
psImagePixelInterpolate.h (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/eam_branch_20070830/psLib/src/imageops/psImagePixelInterpolate.c
r14726 r14776 11 11 * @author Eugene Magnier, IfA 12 12 * 13 * @version $Revision: 1.1.2. 5$ $Name: not supported by cvs2svn $14 * @date $Date: 2007-09-0 3 20:29:07$13 * @version $Revision: 1.1.2.6 $ $Name: not supported by cvs2svn $ 14 * @date $Date: 2007-09-07 20:21:51 $ 15 15 * 16 16 * Copyright 2007 Institute for Astronomy, University of Hawaii … … 38 38 #include "psImageInterpolate.h" 39 39 #include "psImagePixelInterpolate.h" 40 41 #include "psFits.h" 42 #include "psFitsImage.h" 40 43 41 44 # define PS_IMAGE_ITER_STATE(XS,XE,YS,YE,N_MIN,TYPE) \ … … 75 78 for (int ix = 0; ix < mask->numCols; ix++) { 76 79 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 } 79 118 80 119 // examine the neighbors. If at least 6 of the 8 surrounding, or 3 of the 4 corner … … 85 124 // check for poor pixels 86 125 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); 91 130 92 131 nBad ++; … … 122 161 123 162 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: 125 166 // skip the good pixels 126 167 break; … … 167 208 case PS_IMAGE_INTERPOLATE_LL: { 168 209 // 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]; 170 211 break; } 171 212 172 213 case PS_IMAGE_INTERPOLATE_LR: { 173 214 // 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]; 175 216 break; } 176 217 177 218 case PS_IMAGE_INTERPOLATE_UL: { 178 219 // 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]; 180 221 break; } 181 222 182 223 case PS_IMAGE_INTERPOLATE_UR: { 183 224 // 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]; 185 226 break; } 186 227 … … 207 248 assert (value->numRows == mask->numRows); 208 249 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 209 266 psImage *output = psImageAlloc (value->numCols, value->numRows, PS_TYPE_F32); 210 267 … … 217 274 218 275 // allocate a 2D polynomial to fit a quadratic to the valid neighbor pixels. 219 psPolynomial2D *poly2 D= psPolynomial2DAlloc (PS_POLYNOMIAL_ORD, 2, 2);220 poly2 D->mask[2][2] = 1;221 poly2 D->mask[2][1] = 1;222 poly2 D->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; 223 280 224 281 // allocate a 2D polynomial to fit a plane to the valid neighbor pixels. 225 psPolynomial2D *poly1 D= psPolynomial2DAlloc (PS_POLYNOMIAL_ORD, 1, 1);226 poly2 D->mask[1][1] = 1;282 psPolynomial2D *poly1o = psPolynomial2DAlloc (PS_POLYNOMIAL_ORD, 1, 1); 283 poly2o->mask[1][1] = 1; 227 284 228 285 for (int iy = 0; iy < state->numRows; iy++) { … … 256 313 // df->n = n; 257 314 // psVectorFitPolynomial2D (poly, NULL, 0xff, f, df, x, y); 258 psVectorFitPolynomial2D (poly2 D, NULL, 0xff, f, NULL, x, y);315 psVectorFitPolynomial2D (poly2o, NULL, 0xff, f, NULL, x, y); 259 316 // 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); 261 319 break; } 262 320 … … 286 344 f->n = n; 287 345 // df->n = n; 288 // psVectorFitPolynomial2D (poly1 D, NULL, 0xff, f, df, x, y);289 psVectorFitPolynomial2D (poly1 D, NULL, 0xff, f, NULL, x, y);346 // psVectorFitPolynomial2D (poly1o, NULL, 0xff, f, df, x, y); 347 psVectorFitPolynomial2D (poly1o, NULL, 0xff, f, NULL, x, y); 290 348 // apply the fitted quadratic to get the poor pixel value 291 output->data.F32[iy][ix] = psPolynomial2DEval (poly1 D, ix, iy);349 output->data.F32[iy][ix] = psPolynomial2DEval (poly1o, ix + 0.5, iy + 0.5); 292 350 break; } 293 351 294 352 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]; 296 354 break; } 297 355 298 356 default: 299 psAbort("impossible case in __func__"); 357 // skip poor or bad pixels (interpolate later) 358 break; 300 359 } 301 360 } … … 313 372 psFree (f); 314 373 315 psFree (poly2 D);316 psFree (poly1 D);374 psFree (poly2o); 375 psFree (poly1o); 317 376 318 377 psFree (output); -
branches/eam_branch_20070830/psLib/src/imageops/psImagePixelInterpolate.h
r14725 r14776 7 7 * @author Eugene Magnier, IfA 8 8 * 9 * @version $Revision: 1.1.2. 2$ $Name: not supported by cvs2svn $10 * @date $Date: 2007-09-0 2 20:29:50$9 * @version $Revision: 1.1.2.3 $ $Name: not supported by cvs2svn $ 10 * @date $Date: 2007-09-07 20:21:53 $ 11 11 * 12 12 * Copyright 2007 Institute for Astronomy, University of Hawaii … … 21 21 // XXX make these all bit values? 22 22 typedef 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, 24 27 PS_IMAGE_INTERPOLATE_BAD = 0x01, 25 28 PS_IMAGE_INTERPOLATE_CENTER = 0x02, … … 33 36 psImage *psImagePixelInterpolateState (int *nBad, int *nPoor, psImage *mask, psMaskType maskVal); 34 37 bool psImagePixelInterpolatePoor (psImage *image, psImage *state, psImage *mask, psMaskType maskVal); 38 bool psImagePixelInterpolateCenter (psImage *value, psImage *xCoord, psImage *yCoord, psImage *state, psImage *mask, psMaskType maskVal); 35 39 36 40 /// @}
Note:
See TracChangeset
for help on using the changeset viewer.
