Changeset 12802 for trunk/psLib
- Timestamp:
- Apr 11, 2007, 9:54:47 AM (19 years ago)
- File:
-
- 1 edited
-
trunk/psLib/src/imageops/psImageInterpolate.c (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/imageops/psImageInterpolate.c
r12776 r12802 7 7 * @author Paul Price, IfA 8 8 * 9 * @version $Revision: 1. 3$ $Name: not supported by cvs2svn $10 * @date $Date: 2007-04-1 0 03:59:13$9 * @version $Revision: 1.4 $ $Name: not supported by cvs2svn $ 10 * @date $Date: 2007-04-11 19:54:47 $ 11 11 * 12 12 * Copyright 2004-2007 Institute for Astronomy, University of Hawaii … … 236 236 for (int j = 0, yPix = yCentral - (yNum - 1) / 2; j < yNum; j++, yPix++) { \ 237 237 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]; \ 239 239 } \ 240 240 } \ … … 243 243 244 244 // Calculate the value for the image 245 double value = 0.0; // Value to return246 double values[yNum][xNum]; // Values in image247 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 }263 245 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 } 265 263 } 266 264 … … 268 266 const psImage *mask = options->mask; // Image mask 269 267 if (maskValue && mask) { 268 *maskValue = 0; 270 269 psMaskType maskVal = options->maskVal; // Mask value 271 double bad Value = 0.0; // Amount of flux in bad pixels272 int badPix = 0; // Number of bad pixels273 *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? 274 273 for (int j = 0, yPix = yCentral - (yNum - 1) / 2; j < yNum; j++, yPix++) { 275 274 for (int i = 0, xPix = xCentral - (xNum - 1) / 2; i < xNum; i++, xPix++) { 276 275 if (mask->data.PS_TYPE_MASK_DATA[yPix][xPix] & maskVal) { 277 bad Value += values[j][i];278 badPix ++;276 badContrib += fabs(kernel[j][i]); 277 badPix = true; 279 278 } 280 279 *maskValue |= mask->data.PS_TYPE_MASK_DATA[yPix][xPix]; 280 totContrib += fabs(kernel[j][i]); 281 281 } 282 282 } 283 283 284 if (badPix > 0) {285 if ( fabs(badValue) >= fabs(value) *options->poorFrac) {284 if (badPix) { 285 if (badContrib / totContrib >= options->poorFrac) { 286 286 *maskValue |= options->badMask; 287 287 } else { … … 453 453 double xInterpValue = 0.0; /* Interpolation in x */ \ 454 454 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]; \ 456 456 } \ 457 value += yKernel[j] * xInterpValue; /* Interpolating in y */ \457 *imageValue += yKernel[j] * xInterpValue; /* Interpolating in y */ \ 458 458 } \ 459 459 break; \ … … 461 461 462 462 // Calculate the value for the image 463 double value = 0.0; // Value to return464 double values[yNum][xNum]; // Values of interest465 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 }481 463 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 } 483 481 } 484 482 … … 487 485 if (maskValue && mask) { 488 486 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 491 490 *maskValue = 0; 492 491 for (int j = 0, yPix = yCentral - (yNum - 1) / 2; j < yNum; j++, yPix++) { 493 492 // 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 495 495 for (int i = 0, xPix = xCentral - (xNum - 1) / 2; i < xNum; i++, xPix++) { 496 496 if (mask->data.PS_TYPE_MASK_DATA[yPix][xPix] & maskVal) { 497 x InterpValue += values[j][i];498 badPix ++;497 xBadContrib += fabs(xKernel[i]); 498 badPix = true; 499 499 } 500 500 *maskValue |= mask->data.PS_TYPE_MASK_DATA[yPix][xPix]; 501 xTotContrib += fabs(xKernel[i]); 501 502 } 502 503 // 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) { 508 510 *maskValue |= options->badMask; 509 511 } else {
Note:
See TracChangeset
for help on using the changeset viewer.
