Changeset 1261 for trunk/psLib/src/imageops
- Timestamp:
- Jul 22, 2004, 10:09:04 AM (22 years ago)
- Location:
- trunk/psLib/src/imageops
- Files:
-
- 2 edited
-
psImageStats.c (modified) (1 diff)
-
psImageStats.h (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/imageops/psImageStats.c
r1260 r1261 369 369 return(0); 370 370 } 371 372 /*****************************************************************************373 p_psImagePixelInterpolation(image, x, y): this routine takes as input an374 image and coordinates (x, y) and produces as output the corresponding pixel375 value at the those coordinates. For fractional corrdinates (x, y), 2-D376 linear interpolation is performed on the image.377 *****************************************************************************/378 psF32 psImagePixelInterpolate(379 const psImage *input,380 float x,381 float y,382 psF32 unexposedValue,383 psImageInterpolateMode mode)384 {385 386 if (input == NULL) {387 psError(__func__,"Image can not be NULL.");388 return unexposedValue;389 }390 391 #define PSIMAGE_PIXEL_INTERPOLATE_CASE(TYPE) \392 case PS_TYPE_##TYPE: \393 switch (mode) { \394 case PS_INTERPOLATE_FLAT: \395 return p_psImagePixelInterpolateFLAT_##TYPE(input,x,y,unexposedValue); \396 break; \397 case PS_INTERPOLATE_BILINEAR: \398 return p_psImagePixelInterpolateBILINEAR_##TYPE(input,x,y,unexposedValue); \399 break; \400 default: \401 psError(__func__,"Unsupported interpolation mode (#%d)",mode); \402 } \403 break404 405 switch (input->type.type) {406 PSIMAGE_PIXEL_INTERPOLATE_CASE(U8);407 PSIMAGE_PIXEL_INTERPOLATE_CASE(U16);408 PSIMAGE_PIXEL_INTERPOLATE_CASE(U32);409 PSIMAGE_PIXEL_INTERPOLATE_CASE(U64);410 PSIMAGE_PIXEL_INTERPOLATE_CASE(S8);411 PSIMAGE_PIXEL_INTERPOLATE_CASE(S16);412 PSIMAGE_PIXEL_INTERPOLATE_CASE(S32);413 PSIMAGE_PIXEL_INTERPOLATE_CASE(S64);414 PSIMAGE_PIXEL_INTERPOLATE_CASE(F32);415 PSIMAGE_PIXEL_INTERPOLATE_CASE(F64);416 PSIMAGE_PIXEL_INTERPOLATE_CASE(C32);417 PSIMAGE_PIXEL_INTERPOLATE_CASE(C64);418 default:419 psError(__func__,"Unsupported image datatype (%d)",input->type.type);420 }421 422 return unexposedValue;423 }424 425 #define PSIMAGE_PIXEL_INTERPOLATE_FLAT(TYPE) \426 inline psF64 p_psImagePixelInterpolateFLAT_##TYPE(const psImage *input, \427 float x, \428 float y, \429 psF64 unexposedValue) \430 { \431 int intX = (int) round((psF64)(x) - 0.5); \432 int intY = (int) round((psF64)(y) - 0.5); \433 int lastX = input->numCols - 1; \434 int lastY = input->numRows - 1; \435 \436 if ((intX < 0) || \437 (intX > lastX) || \438 (intY < 0) || \439 (intY > lastY)) { \440 return unexposedValue; \441 } \442 \443 return input->data.TYPE[intY][intX]; \444 }445 446 #define PSIMAGE_PIXEL_INTERPOLATE_FLAT_COMPLEX(TYPE) \447 inline psC64 p_psImagePixelInterpolateFLAT_##TYPE(const psImage *input, \448 float x, \449 float y, \450 psC64 unexposedValue) \451 { \452 int intX = (int) round((psF64)(x) - 0.5); \453 int intY = (int) round((psF64)(y) - 0.5); \454 int lastX = input->numCols - 1; \455 int lastY = input->numRows - 1; \456 \457 if ((intX < 0) || \458 (intX > lastX) || \459 (intY < 0) || \460 (intY > lastY)) { \461 return unexposedValue; \462 } \463 \464 return input->data.TYPE[intY][intX]; \465 }466 467 PSIMAGE_PIXEL_INTERPOLATE_FLAT(U8)468 PSIMAGE_PIXEL_INTERPOLATE_FLAT(U16)469 PSIMAGE_PIXEL_INTERPOLATE_FLAT(U32)470 PSIMAGE_PIXEL_INTERPOLATE_FLAT(U64)471 PSIMAGE_PIXEL_INTERPOLATE_FLAT(S8)472 PSIMAGE_PIXEL_INTERPOLATE_FLAT(S16)473 PSIMAGE_PIXEL_INTERPOLATE_FLAT(S32)474 PSIMAGE_PIXEL_INTERPOLATE_FLAT(S64)475 PSIMAGE_PIXEL_INTERPOLATE_FLAT(F32)476 PSIMAGE_PIXEL_INTERPOLATE_FLAT(F64)477 PSIMAGE_PIXEL_INTERPOLATE_FLAT_COMPLEX(C32)478 PSIMAGE_PIXEL_INTERPOLATE_FLAT_COMPLEX(C64)479 480 #define PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(TYPE) \481 inline psF64 p_psImagePixelInterpolateBILINEAR_##TYPE(const psImage *input, \482 float x, \483 float y, \484 psF64 unexposedValue) \485 { \486 double floorX = floor((psF64)(x) - 0.5); \487 double floorY = floor((psF64)(y) - 0.5); \488 double fracX = x - 0.5 - floorX; \489 double fracY = y - 0.5 - floorY; \490 int intFloorX = (int) floorX; \491 int intFloorY = (int) floorY; \492 int lastX = input->numCols - 1; \493 int lastY = input->numRows - 1; \494 double rx = 0.0; \495 psF64 pixel = 0.0; \496 ps##TYPE* currentRow; \497 ps##TYPE* nextRow; \498 \499 if ((intFloorX < 0) || \500 (intFloorX > lastX) || \501 (intFloorY < 0) || \502 (intFloorY > lastY)) { \503 return unexposedValue; \504 } \505 \506 currentRow = input->data.TYPE[intFloorY]; \507 if (intFloorY == lastY) { \508 pixel = currentRow[intFloorX]; \509 if (intFloorX < lastX) { \510 pixel+= fracY * ((psF64)currentRow[intFloorX+1] - \511 (psF64)currentRow[intFloorX]); \512 } \513 return(pixel); \514 } \515 nextRow = input->data.TYPE[intFloorY+1]; \516 if (intFloorX == lastX) { \517 pixel = currentRow[intFloorX]; \518 if (intFloorY < lastY) { \519 pixel+= fracX * ((psF64)nextRow[intFloorX] - \520 (psF64)currentRow[intFloorX]); \521 } \522 return(pixel); \523 } \524 \525 rx = currentRow[intFloorX] + \526 fracX * ((psF64)currentRow[intFloorX+1] - \527 (psF64)currentRow[intFloorX]); \528 \529 pixel = rx + fracY * ((psF64)nextRow[intFloorX] + \530 fracX * ((psF64)nextRow[intFloorX+1] - \531 (psF64)nextRow[intFloorX]) - rx); \532 \533 return(pixel); \534 }535 536 #define PSIMAGE_PIXEL_INTERPOLATE_BILINEAR_COMPLEX(TYPE) \537 inline psC64 p_psImagePixelInterpolateBILINEAR_##TYPE(const psImage *input, \538 float x, \539 float y, \540 psC64 unexposedValue) \541 { \542 double floorX = floor((psF64)(x) - 0.5); \543 double floorY = floor((psF64)(y) - 0.5); \544 double fracX = x - 0.5 - floorX; \545 double fracY = y - 0.5 - floorY; \546 int intFloorX = (int) floorX; \547 int intFloorY = (int) floorY; \548 int lastX = input->numCols - 1; \549 int lastY = input->numRows - 1; \550 double rx = 0.0; \551 psC64 pixel = 0.0; \552 ps##TYPE* currentRow; \553 ps##TYPE* nextRow; \554 \555 if ((intFloorX < 0) || \556 (intFloorX > lastX) || \557 (intFloorY < 0) || \558 (intFloorY > lastY)) { \559 return unexposedValue; \560 } \561 \562 currentRow = input->data.TYPE[intFloorY]; \563 if (intFloorY == lastY) { \564 pixel = currentRow[intFloorX]; \565 if (intFloorX < lastX) { \566 pixel+= fracY * (currentRow[intFloorX+1] - \567 currentRow[intFloorX]); \568 } \569 return(pixel); \570 } \571 nextRow = input->data.TYPE[intFloorY+1]; \572 if (intFloorX == lastX) { \573 pixel = currentRow[intFloorX]; \574 if (intFloorY < lastY) { \575 pixel+= fracX * (nextRow[intFloorX] - \576 currentRow[intFloorX]); \577 } \578 return(pixel); \579 } \580 \581 rx = currentRow[intFloorX] + \582 fracX * (currentRow[intFloorX+1] - \583 currentRow[intFloorX]); \584 \585 pixel = rx + fracY * ((psF64)nextRow[intFloorX] + \586 fracX * (nextRow[intFloorX+1] - \587 nextRow[intFloorX]) - rx); \588 \589 return(pixel); \590 }591 592 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U8)593 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U16)594 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U32)595 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U64)596 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S8)597 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S16)598 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S32)599 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S64)600 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(F32)601 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(F64)602 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR_COMPLEX(C32)603 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR_COMPLEX(C64)604 -
trunk/psLib/src/imageops/psImageStats.h
r1260 r1261 10 10 * @author George Gusciora, MHPCC 11 11 * 12 * @version $Revision: 1. 6$ $Name: not supported by cvs2svn $13 * @date $Date: 2004-07-22 20:0 2:57$12 * @version $Revision: 1.7 $ $Name: not supported by cvs2svn $ 13 * @date $Date: 2004-07-22 20:09:04 $ 14 14 * 15 15 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 24 24 #include "psStats.h" 25 25 #include "psFunctions.h" 26 27 typedef enum {28 PS_INTERPOLATE_FLAT,29 PS_INTERPOLATE_BILINEAR30 } psImageInterpolateMode;31 26 32 27 /// This routine must determine the various statistics for the image. … … 56 51 57 52 58 psF32 psImagePixelInterpolate(59 const psImage *input,60 float x,61 float y,62 psF32 unexposedValue,63 psImageInterpolateMode mode64 );65 66 #define p_psImagePixelInterpolateFcns(TYPE) \67 inline psF64 p_psImagePixelInterpolateFLAT_##TYPE( \68 const psImage *input, \69 float x, \70 float y, \71 psF64 unexposedValue \72 ); \73 inline psF64 p_psImagePixelInterpolateBILINEAR_##TYPE( \74 const psImage *input, \75 float x, \76 float y, \77 psF64 unexposedValue \78 );79 80 #define p_psImagePixelInterpolateComplexFcns(TYPE) \81 inline psC64 p_psImagePixelInterpolateFLAT_##TYPE( \82 const psImage *input, \83 float x, \84 float y, \85 psC64 unexposedValue \86 ); \87 inline psC64 p_psImagePixelInterpolateBILINEAR_##TYPE( \88 const psImage *input, \89 float x, \90 float y, \91 psC64 unexposedValue \92 );93 94 p_psImagePixelInterpolateFcns(U8)95 p_psImagePixelInterpolateFcns(U16)96 p_psImagePixelInterpolateFcns(U32)97 p_psImagePixelInterpolateFcns(U64)98 p_psImagePixelInterpolateFcns(S8)99 p_psImagePixelInterpolateFcns(S16)100 p_psImagePixelInterpolateFcns(S32)101 p_psImagePixelInterpolateFcns(S64)102 p_psImagePixelInterpolateFcns(F32)103 p_psImagePixelInterpolateFcns(F64)104 p_psImagePixelInterpolateComplexFcns(C32)105 p_psImagePixelInterpolateComplexFcns(C64)106 53 107 54 #endif
Note:
See TracChangeset
for help on using the changeset viewer.
