Changeset 1261 for trunk/psLib/src/image/psImageStats.c
- Timestamp:
- Jul 22, 2004, 10:09:04 AM (22 years ago)
- File:
-
- 1 edited
-
trunk/psLib/src/image/psImageStats.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
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
Note:
See TracChangeset
for help on using the changeset viewer.
