Changeset 1261
- Timestamp:
- Jul 22, 2004, 10:09:04 AM (22 years ago)
- Location:
- trunk/psLib/src
- Files:
-
- 8 edited
-
image/psImage.c (modified) (2 diffs)
-
image/psImage.h (modified) (3 diffs)
-
image/psImageStats.c (modified) (1 diff)
-
image/psImageStats.h (modified) (3 diffs)
-
imageops/psImageStats.c (modified) (1 diff)
-
imageops/psImageStats.h (modified) (3 diffs)
-
mathtypes/psImage.c (modified) (2 diffs)
-
mathtypes/psImage.h (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/image/psImage.c
r1205 r1261 9 9 * @author Ross Harman, MHPCC 10 10 * 11 * @version $Revision: 1.3 3$ $Name: not supported by cvs2svn $12 * @date $Date: 2004-07- 09 21:48:07$11 * @version $Revision: 1.34 $ $Name: not supported by cvs2svn $ 12 * @date $Date: 2004-07-22 20:09:04 $ 13 13 * 14 14 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 400 400 } 401 401 402 /***************************************************************************** 403 p_psImagePixelInterpolation(image, x, y): this routine takes as input an 404 image and coordinates (x, y) and produces as output the corresponding pixel 405 value at the those coordinates. For fractional corrdinates (x, y), 2-D 406 linear interpolation is performed on the image. 407 *****************************************************************************/ 408 psF32 psImagePixelInterpolate( 409 const psImage *input, 410 float x, 411 float y, 412 psF32 unexposedValue, 413 psImageInterpolateMode mode) 414 { 415 416 if (input == NULL) { 417 psError(__func__,"Image can not be NULL."); 418 return unexposedValue; 419 } 420 421 #define PSIMAGE_PIXEL_INTERPOLATE_CASE(TYPE) \ 422 case PS_TYPE_##TYPE: \ 423 switch (mode) { \ 424 case PS_INTERPOLATE_FLAT: \ 425 return p_psImagePixelInterpolateFLAT_##TYPE(input,x,y,unexposedValue); \ 426 break; \ 427 case PS_INTERPOLATE_BILINEAR: \ 428 return p_psImagePixelInterpolateBILINEAR_##TYPE(input,x,y,unexposedValue); \ 429 break; \ 430 default: \ 431 psError(__func__,"Unsupported interpolation mode (#%d)",mode); \ 432 } \ 433 break 434 435 switch (input->type.type) { 436 PSIMAGE_PIXEL_INTERPOLATE_CASE(U8); 437 PSIMAGE_PIXEL_INTERPOLATE_CASE(U16); 438 PSIMAGE_PIXEL_INTERPOLATE_CASE(U32); 439 PSIMAGE_PIXEL_INTERPOLATE_CASE(U64); 440 PSIMAGE_PIXEL_INTERPOLATE_CASE(S8); 441 PSIMAGE_PIXEL_INTERPOLATE_CASE(S16); 442 PSIMAGE_PIXEL_INTERPOLATE_CASE(S32); 443 PSIMAGE_PIXEL_INTERPOLATE_CASE(S64); 444 PSIMAGE_PIXEL_INTERPOLATE_CASE(F32); 445 PSIMAGE_PIXEL_INTERPOLATE_CASE(F64); 446 PSIMAGE_PIXEL_INTERPOLATE_CASE(C32); 447 PSIMAGE_PIXEL_INTERPOLATE_CASE(C64); 448 default: 449 psError(__func__,"Unsupported image datatype (%d)",input->type.type); 450 } 451 452 return unexposedValue; 453 } 454 455 #define PSIMAGE_PIXEL_INTERPOLATE_FLAT(TYPE) \ 456 inline psF64 p_psImagePixelInterpolateFLAT_##TYPE(const psImage *input, \ 457 float x, \ 458 float y, \ 459 psF64 unexposedValue) \ 460 { \ 461 int intX = (int) round((psF64)(x) - 0.5); \ 462 int intY = (int) round((psF64)(y) - 0.5); \ 463 int lastX = input->numCols - 1; \ 464 int lastY = input->numRows - 1; \ 465 \ 466 if ((intX < 0) || \ 467 (intX > lastX) || \ 468 (intY < 0) || \ 469 (intY > lastY)) { \ 470 return unexposedValue; \ 471 } \ 472 \ 473 return input->data.TYPE[intY][intX]; \ 474 } 475 476 #define PSIMAGE_PIXEL_INTERPOLATE_FLAT_COMPLEX(TYPE) \ 477 inline psC64 p_psImagePixelInterpolateFLAT_##TYPE(const psImage *input, \ 478 float x, \ 479 float y, \ 480 psC64 unexposedValue) \ 481 { \ 482 int intX = (int) round((psF64)(x) - 0.5); \ 483 int intY = (int) round((psF64)(y) - 0.5); \ 484 int lastX = input->numCols - 1; \ 485 int lastY = input->numRows - 1; \ 486 \ 487 if ((intX < 0) || \ 488 (intX > lastX) || \ 489 (intY < 0) || \ 490 (intY > lastY)) { \ 491 return unexposedValue; \ 492 } \ 493 \ 494 return input->data.TYPE[intY][intX]; \ 495 } 496 497 PSIMAGE_PIXEL_INTERPOLATE_FLAT(U8) 498 PSIMAGE_PIXEL_INTERPOLATE_FLAT(U16) 499 PSIMAGE_PIXEL_INTERPOLATE_FLAT(U32) 500 PSIMAGE_PIXEL_INTERPOLATE_FLAT(U64) 501 PSIMAGE_PIXEL_INTERPOLATE_FLAT(S8) 502 PSIMAGE_PIXEL_INTERPOLATE_FLAT(S16) 503 PSIMAGE_PIXEL_INTERPOLATE_FLAT(S32) 504 PSIMAGE_PIXEL_INTERPOLATE_FLAT(S64) 505 PSIMAGE_PIXEL_INTERPOLATE_FLAT(F32) 506 PSIMAGE_PIXEL_INTERPOLATE_FLAT(F64) 507 PSIMAGE_PIXEL_INTERPOLATE_FLAT_COMPLEX(C32) 508 PSIMAGE_PIXEL_INTERPOLATE_FLAT_COMPLEX(C64) 509 510 #define PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(TYPE) \ 511 inline psF64 p_psImagePixelInterpolateBILINEAR_##TYPE(const psImage *input, \ 512 float x, \ 513 float y, \ 514 psF64 unexposedValue) \ 515 { \ 516 double floorX = floor((psF64)(x) - 0.5); \ 517 double floorY = floor((psF64)(y) - 0.5); \ 518 double fracX = x - 0.5 - floorX; \ 519 double fracY = y - 0.5 - floorY; \ 520 int intFloorX = (int) floorX; \ 521 int intFloorY = (int) floorY; \ 522 int lastX = input->numCols - 1; \ 523 int lastY = input->numRows - 1; \ 524 double rx = 0.0; \ 525 psF64 pixel = 0.0; \ 526 ps##TYPE* currentRow; \ 527 ps##TYPE* nextRow; \ 528 \ 529 if ((intFloorX < 0) || \ 530 (intFloorX > lastX) || \ 531 (intFloorY < 0) || \ 532 (intFloorY > lastY)) { \ 533 return unexposedValue; \ 534 } \ 535 \ 536 currentRow = input->data.TYPE[intFloorY]; \ 537 if (intFloorY == lastY) { \ 538 pixel = currentRow[intFloorX]; \ 539 if (intFloorX < lastX) { \ 540 pixel+= fracY * ((psF64)currentRow[intFloorX+1] - \ 541 (psF64)currentRow[intFloorX]); \ 542 } \ 543 return(pixel); \ 544 } \ 545 nextRow = input->data.TYPE[intFloorY+1]; \ 546 if (intFloorX == lastX) { \ 547 pixel = currentRow[intFloorX]; \ 548 if (intFloorY < lastY) { \ 549 pixel+= fracX * ((psF64)nextRow[intFloorX] - \ 550 (psF64)currentRow[intFloorX]); \ 551 } \ 552 return(pixel); \ 553 } \ 554 \ 555 rx = currentRow[intFloorX] + \ 556 fracX * ((psF64)currentRow[intFloorX+1] - \ 557 (psF64)currentRow[intFloorX]); \ 558 \ 559 pixel = rx + fracY * ((psF64)nextRow[intFloorX] + \ 560 fracX * ((psF64)nextRow[intFloorX+1] - \ 561 (psF64)nextRow[intFloorX]) - rx); \ 562 \ 563 return(pixel); \ 564 } 565 566 #define PSIMAGE_PIXEL_INTERPOLATE_BILINEAR_COMPLEX(TYPE) \ 567 inline psC64 p_psImagePixelInterpolateBILINEAR_##TYPE(const psImage *input, \ 568 float x, \ 569 float y, \ 570 psC64 unexposedValue) \ 571 { \ 572 double floorX = floor((psF64)(x) - 0.5); \ 573 double floorY = floor((psF64)(y) - 0.5); \ 574 double fracX = x - 0.5 - floorX; \ 575 double fracY = y - 0.5 - floorY; \ 576 int intFloorX = (int) floorX; \ 577 int intFloorY = (int) floorY; \ 578 int lastX = input->numCols - 1; \ 579 int lastY = input->numRows - 1; \ 580 double rx = 0.0; \ 581 psC64 pixel = 0.0; \ 582 ps##TYPE* currentRow; \ 583 ps##TYPE* nextRow; \ 584 \ 585 if ((intFloorX < 0) || \ 586 (intFloorX > lastX) || \ 587 (intFloorY < 0) || \ 588 (intFloorY > lastY)) { \ 589 return unexposedValue; \ 590 } \ 591 \ 592 currentRow = input->data.TYPE[intFloorY]; \ 593 if (intFloorY == lastY) { \ 594 pixel = currentRow[intFloorX]; \ 595 if (intFloorX < lastX) { \ 596 pixel+= fracY * (currentRow[intFloorX+1] - \ 597 currentRow[intFloorX]); \ 598 } \ 599 return(pixel); \ 600 } \ 601 nextRow = input->data.TYPE[intFloorY+1]; \ 602 if (intFloorX == lastX) { \ 603 pixel = currentRow[intFloorX]; \ 604 if (intFloorY < lastY) { \ 605 pixel+= fracX * (nextRow[intFloorX] - \ 606 currentRow[intFloorX]); \ 607 } \ 608 return(pixel); \ 609 } \ 610 \ 611 rx = currentRow[intFloorX] + \ 612 fracX * (currentRow[intFloorX+1] - \ 613 currentRow[intFloorX]); \ 614 \ 615 pixel = rx + fracY * ((psF64)nextRow[intFloorX] + \ 616 fracX * (nextRow[intFloorX+1] - \ 617 nextRow[intFloorX]) - rx); \ 618 \ 619 return(pixel); \ 620 } 621 622 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U8) 623 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U16) 624 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U32) 625 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U64) 626 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S8) 627 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S16) 628 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S32) 629 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S64) 630 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(F32) 631 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(F64) 632 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR_COMPLEX(C32) 633 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR_COMPLEX(C64) 634 635 -
trunk/psLib/src/image/psImage.h
r1205 r1261 11 11 * @author Ross Harman, MHPCC 12 12 * 13 * @version $Revision: 1.2 3$ $Name: not supported by cvs2svn $14 * @date $Date: 2004-07- 09 21:48:07$13 * @version $Revision: 1.24 $ $Name: not supported by cvs2svn $ 14 * @date $Date: 2004-07-22 20:09:04 $ 15 15 * 16 16 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 25 25 /// @addtogroup Image 26 26 /// @{ 27 28 typedef enum { 29 PS_INTERPOLATE_FLAT, 30 PS_INTERPOLATE_BILINEAR 31 } psImageInterpolateMode; 27 32 28 33 /** Basic image data structure. … … 137 142 ); 138 143 144 psF32 psImagePixelInterpolate( 145 const psImage *input, 146 float x, 147 float y, 148 psF32 unexposedValue, 149 psImageInterpolateMode mode 150 ); 151 152 #define p_psImagePixelInterpolateFcns(TYPE) \ 153 inline psF64 p_psImagePixelInterpolateFLAT_##TYPE( \ 154 const psImage *input, \ 155 float x, \ 156 float y, \ 157 psF64 unexposedValue \ 158 ); \ 159 inline psF64 p_psImagePixelInterpolateBILINEAR_##TYPE( \ 160 const psImage *input, \ 161 float x, \ 162 float y, \ 163 psF64 unexposedValue \ 164 ); 165 166 #define p_psImagePixelInterpolateComplexFcns(TYPE) \ 167 inline psC64 p_psImagePixelInterpolateFLAT_##TYPE( \ 168 const psImage *input, \ 169 float x, \ 170 float y, \ 171 psC64 unexposedValue \ 172 ); \ 173 inline psC64 p_psImagePixelInterpolateBILINEAR_##TYPE( \ 174 const psImage *input, \ 175 float x, \ 176 float y, \ 177 psC64 unexposedValue \ 178 ); 179 180 p_psImagePixelInterpolateFcns(U8) 181 p_psImagePixelInterpolateFcns(U16) 182 p_psImagePixelInterpolateFcns(U32) 183 p_psImagePixelInterpolateFcns(U64) 184 p_psImagePixelInterpolateFcns(S8) 185 p_psImagePixelInterpolateFcns(S16) 186 p_psImagePixelInterpolateFcns(S32) 187 p_psImagePixelInterpolateFcns(S64) 188 p_psImagePixelInterpolateFcns(F32) 189 p_psImagePixelInterpolateFcns(F64) 190 p_psImagePixelInterpolateComplexFcns(C32) 191 p_psImagePixelInterpolateComplexFcns(C64) 192 139 193 /// @} 140 194 -
trunk/psLib/src/image/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/image/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 -
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 -
trunk/psLib/src/mathtypes/psImage.c
r1205 r1261 9 9 * @author Ross Harman, MHPCC 10 10 * 11 * @version $Revision: 1.3 3$ $Name: not supported by cvs2svn $12 * @date $Date: 2004-07- 09 21:48:07$11 * @version $Revision: 1.34 $ $Name: not supported by cvs2svn $ 12 * @date $Date: 2004-07-22 20:09:04 $ 13 13 * 14 14 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 400 400 } 401 401 402 /***************************************************************************** 403 p_psImagePixelInterpolation(image, x, y): this routine takes as input an 404 image and coordinates (x, y) and produces as output the corresponding pixel 405 value at the those coordinates. For fractional corrdinates (x, y), 2-D 406 linear interpolation is performed on the image. 407 *****************************************************************************/ 408 psF32 psImagePixelInterpolate( 409 const psImage *input, 410 float x, 411 float y, 412 psF32 unexposedValue, 413 psImageInterpolateMode mode) 414 { 415 416 if (input == NULL) { 417 psError(__func__,"Image can not be NULL."); 418 return unexposedValue; 419 } 420 421 #define PSIMAGE_PIXEL_INTERPOLATE_CASE(TYPE) \ 422 case PS_TYPE_##TYPE: \ 423 switch (mode) { \ 424 case PS_INTERPOLATE_FLAT: \ 425 return p_psImagePixelInterpolateFLAT_##TYPE(input,x,y,unexposedValue); \ 426 break; \ 427 case PS_INTERPOLATE_BILINEAR: \ 428 return p_psImagePixelInterpolateBILINEAR_##TYPE(input,x,y,unexposedValue); \ 429 break; \ 430 default: \ 431 psError(__func__,"Unsupported interpolation mode (#%d)",mode); \ 432 } \ 433 break 434 435 switch (input->type.type) { 436 PSIMAGE_PIXEL_INTERPOLATE_CASE(U8); 437 PSIMAGE_PIXEL_INTERPOLATE_CASE(U16); 438 PSIMAGE_PIXEL_INTERPOLATE_CASE(U32); 439 PSIMAGE_PIXEL_INTERPOLATE_CASE(U64); 440 PSIMAGE_PIXEL_INTERPOLATE_CASE(S8); 441 PSIMAGE_PIXEL_INTERPOLATE_CASE(S16); 442 PSIMAGE_PIXEL_INTERPOLATE_CASE(S32); 443 PSIMAGE_PIXEL_INTERPOLATE_CASE(S64); 444 PSIMAGE_PIXEL_INTERPOLATE_CASE(F32); 445 PSIMAGE_PIXEL_INTERPOLATE_CASE(F64); 446 PSIMAGE_PIXEL_INTERPOLATE_CASE(C32); 447 PSIMAGE_PIXEL_INTERPOLATE_CASE(C64); 448 default: 449 psError(__func__,"Unsupported image datatype (%d)",input->type.type); 450 } 451 452 return unexposedValue; 453 } 454 455 #define PSIMAGE_PIXEL_INTERPOLATE_FLAT(TYPE) \ 456 inline psF64 p_psImagePixelInterpolateFLAT_##TYPE(const psImage *input, \ 457 float x, \ 458 float y, \ 459 psF64 unexposedValue) \ 460 { \ 461 int intX = (int) round((psF64)(x) - 0.5); \ 462 int intY = (int) round((psF64)(y) - 0.5); \ 463 int lastX = input->numCols - 1; \ 464 int lastY = input->numRows - 1; \ 465 \ 466 if ((intX < 0) || \ 467 (intX > lastX) || \ 468 (intY < 0) || \ 469 (intY > lastY)) { \ 470 return unexposedValue; \ 471 } \ 472 \ 473 return input->data.TYPE[intY][intX]; \ 474 } 475 476 #define PSIMAGE_PIXEL_INTERPOLATE_FLAT_COMPLEX(TYPE) \ 477 inline psC64 p_psImagePixelInterpolateFLAT_##TYPE(const psImage *input, \ 478 float x, \ 479 float y, \ 480 psC64 unexposedValue) \ 481 { \ 482 int intX = (int) round((psF64)(x) - 0.5); \ 483 int intY = (int) round((psF64)(y) - 0.5); \ 484 int lastX = input->numCols - 1; \ 485 int lastY = input->numRows - 1; \ 486 \ 487 if ((intX < 0) || \ 488 (intX > lastX) || \ 489 (intY < 0) || \ 490 (intY > lastY)) { \ 491 return unexposedValue; \ 492 } \ 493 \ 494 return input->data.TYPE[intY][intX]; \ 495 } 496 497 PSIMAGE_PIXEL_INTERPOLATE_FLAT(U8) 498 PSIMAGE_PIXEL_INTERPOLATE_FLAT(U16) 499 PSIMAGE_PIXEL_INTERPOLATE_FLAT(U32) 500 PSIMAGE_PIXEL_INTERPOLATE_FLAT(U64) 501 PSIMAGE_PIXEL_INTERPOLATE_FLAT(S8) 502 PSIMAGE_PIXEL_INTERPOLATE_FLAT(S16) 503 PSIMAGE_PIXEL_INTERPOLATE_FLAT(S32) 504 PSIMAGE_PIXEL_INTERPOLATE_FLAT(S64) 505 PSIMAGE_PIXEL_INTERPOLATE_FLAT(F32) 506 PSIMAGE_PIXEL_INTERPOLATE_FLAT(F64) 507 PSIMAGE_PIXEL_INTERPOLATE_FLAT_COMPLEX(C32) 508 PSIMAGE_PIXEL_INTERPOLATE_FLAT_COMPLEX(C64) 509 510 #define PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(TYPE) \ 511 inline psF64 p_psImagePixelInterpolateBILINEAR_##TYPE(const psImage *input, \ 512 float x, \ 513 float y, \ 514 psF64 unexposedValue) \ 515 { \ 516 double floorX = floor((psF64)(x) - 0.5); \ 517 double floorY = floor((psF64)(y) - 0.5); \ 518 double fracX = x - 0.5 - floorX; \ 519 double fracY = y - 0.5 - floorY; \ 520 int intFloorX = (int) floorX; \ 521 int intFloorY = (int) floorY; \ 522 int lastX = input->numCols - 1; \ 523 int lastY = input->numRows - 1; \ 524 double rx = 0.0; \ 525 psF64 pixel = 0.0; \ 526 ps##TYPE* currentRow; \ 527 ps##TYPE* nextRow; \ 528 \ 529 if ((intFloorX < 0) || \ 530 (intFloorX > lastX) || \ 531 (intFloorY < 0) || \ 532 (intFloorY > lastY)) { \ 533 return unexposedValue; \ 534 } \ 535 \ 536 currentRow = input->data.TYPE[intFloorY]; \ 537 if (intFloorY == lastY) { \ 538 pixel = currentRow[intFloorX]; \ 539 if (intFloorX < lastX) { \ 540 pixel+= fracY * ((psF64)currentRow[intFloorX+1] - \ 541 (psF64)currentRow[intFloorX]); \ 542 } \ 543 return(pixel); \ 544 } \ 545 nextRow = input->data.TYPE[intFloorY+1]; \ 546 if (intFloorX == lastX) { \ 547 pixel = currentRow[intFloorX]; \ 548 if (intFloorY < lastY) { \ 549 pixel+= fracX * ((psF64)nextRow[intFloorX] - \ 550 (psF64)currentRow[intFloorX]); \ 551 } \ 552 return(pixel); \ 553 } \ 554 \ 555 rx = currentRow[intFloorX] + \ 556 fracX * ((psF64)currentRow[intFloorX+1] - \ 557 (psF64)currentRow[intFloorX]); \ 558 \ 559 pixel = rx + fracY * ((psF64)nextRow[intFloorX] + \ 560 fracX * ((psF64)nextRow[intFloorX+1] - \ 561 (psF64)nextRow[intFloorX]) - rx); \ 562 \ 563 return(pixel); \ 564 } 565 566 #define PSIMAGE_PIXEL_INTERPOLATE_BILINEAR_COMPLEX(TYPE) \ 567 inline psC64 p_psImagePixelInterpolateBILINEAR_##TYPE(const psImage *input, \ 568 float x, \ 569 float y, \ 570 psC64 unexposedValue) \ 571 { \ 572 double floorX = floor((psF64)(x) - 0.5); \ 573 double floorY = floor((psF64)(y) - 0.5); \ 574 double fracX = x - 0.5 - floorX; \ 575 double fracY = y - 0.5 - floorY; \ 576 int intFloorX = (int) floorX; \ 577 int intFloorY = (int) floorY; \ 578 int lastX = input->numCols - 1; \ 579 int lastY = input->numRows - 1; \ 580 double rx = 0.0; \ 581 psC64 pixel = 0.0; \ 582 ps##TYPE* currentRow; \ 583 ps##TYPE* nextRow; \ 584 \ 585 if ((intFloorX < 0) || \ 586 (intFloorX > lastX) || \ 587 (intFloorY < 0) || \ 588 (intFloorY > lastY)) { \ 589 return unexposedValue; \ 590 } \ 591 \ 592 currentRow = input->data.TYPE[intFloorY]; \ 593 if (intFloorY == lastY) { \ 594 pixel = currentRow[intFloorX]; \ 595 if (intFloorX < lastX) { \ 596 pixel+= fracY * (currentRow[intFloorX+1] - \ 597 currentRow[intFloorX]); \ 598 } \ 599 return(pixel); \ 600 } \ 601 nextRow = input->data.TYPE[intFloorY+1]; \ 602 if (intFloorX == lastX) { \ 603 pixel = currentRow[intFloorX]; \ 604 if (intFloorY < lastY) { \ 605 pixel+= fracX * (nextRow[intFloorX] - \ 606 currentRow[intFloorX]); \ 607 } \ 608 return(pixel); \ 609 } \ 610 \ 611 rx = currentRow[intFloorX] + \ 612 fracX * (currentRow[intFloorX+1] - \ 613 currentRow[intFloorX]); \ 614 \ 615 pixel = rx + fracY * ((psF64)nextRow[intFloorX] + \ 616 fracX * (nextRow[intFloorX+1] - \ 617 nextRow[intFloorX]) - rx); \ 618 \ 619 return(pixel); \ 620 } 621 622 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U8) 623 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U16) 624 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U32) 625 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U64) 626 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S8) 627 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S16) 628 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S32) 629 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S64) 630 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(F32) 631 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(F64) 632 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR_COMPLEX(C32) 633 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR_COMPLEX(C64) 634 635 -
trunk/psLib/src/mathtypes/psImage.h
r1205 r1261 11 11 * @author Ross Harman, MHPCC 12 12 * 13 * @version $Revision: 1.2 3$ $Name: not supported by cvs2svn $14 * @date $Date: 2004-07- 09 21:48:07$13 * @version $Revision: 1.24 $ $Name: not supported by cvs2svn $ 14 * @date $Date: 2004-07-22 20:09:04 $ 15 15 * 16 16 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 25 25 /// @addtogroup Image 26 26 /// @{ 27 28 typedef enum { 29 PS_INTERPOLATE_FLAT, 30 PS_INTERPOLATE_BILINEAR 31 } psImageInterpolateMode; 27 32 28 33 /** Basic image data structure. … … 137 142 ); 138 143 144 psF32 psImagePixelInterpolate( 145 const psImage *input, 146 float x, 147 float y, 148 psF32 unexposedValue, 149 psImageInterpolateMode mode 150 ); 151 152 #define p_psImagePixelInterpolateFcns(TYPE) \ 153 inline psF64 p_psImagePixelInterpolateFLAT_##TYPE( \ 154 const psImage *input, \ 155 float x, \ 156 float y, \ 157 psF64 unexposedValue \ 158 ); \ 159 inline psF64 p_psImagePixelInterpolateBILINEAR_##TYPE( \ 160 const psImage *input, \ 161 float x, \ 162 float y, \ 163 psF64 unexposedValue \ 164 ); 165 166 #define p_psImagePixelInterpolateComplexFcns(TYPE) \ 167 inline psC64 p_psImagePixelInterpolateFLAT_##TYPE( \ 168 const psImage *input, \ 169 float x, \ 170 float y, \ 171 psC64 unexposedValue \ 172 ); \ 173 inline psC64 p_psImagePixelInterpolateBILINEAR_##TYPE( \ 174 const psImage *input, \ 175 float x, \ 176 float y, \ 177 psC64 unexposedValue \ 178 ); 179 180 p_psImagePixelInterpolateFcns(U8) 181 p_psImagePixelInterpolateFcns(U16) 182 p_psImagePixelInterpolateFcns(U32) 183 p_psImagePixelInterpolateFcns(U64) 184 p_psImagePixelInterpolateFcns(S8) 185 p_psImagePixelInterpolateFcns(S16) 186 p_psImagePixelInterpolateFcns(S32) 187 p_psImagePixelInterpolateFcns(S64) 188 p_psImagePixelInterpolateFcns(F32) 189 p_psImagePixelInterpolateFcns(F64) 190 p_psImagePixelInterpolateComplexFcns(C32) 191 p_psImagePixelInterpolateComplexFcns(C64) 192 139 193 /// @} 140 194
Note:
See TracChangeset
for help on using the changeset viewer.
