Changeset 12741 for trunk/psLib/src/imageops
- Timestamp:
- Apr 4, 2007, 12:42:02 PM (19 years ago)
- Location:
- trunk/psLib/src/imageops
- Files:
-
- 2 added
- 6 edited
-
Makefile.am (modified) (2 diffs)
-
psImageConvolve.c (modified) (6 diffs)
-
psImageConvolve.h (modified) (2 diffs)
-
psImageGeomManip.c (modified) (14 diffs)
-
psImageGeomManip.h (modified) (3 diffs)
-
psImageInterpolate.c (added)
-
psImageInterpolate.h (added)
-
psImagePixelExtract.c (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/imageops/Makefile.am
r12588 r12741 8 8 psImageConvolve.c \ 9 9 psImageGeomManip.c \ 10 psImageInterpolate.c \ 10 11 psImagePixelExtract.c \ 11 12 psImagePixelManip.c \ … … 22 23 psImageConvolve.h \ 23 24 psImageGeomManip.h \ 25 psImageInterpolate.h \ 24 26 psImagePixelExtract.h \ 25 27 psImagePixelManip.h \ -
trunk/psLib/src/imageops/psImageConvolve.c
r12187 r12741 7 7 /// @author Eugene Magnier, IfA 8 8 /// 9 /// @version $Revision: 1.5 0$ $Name: not supported by cvs2svn $10 /// @date $Date: 2007-0 3-02 22:19:21$9 /// @version $Revision: 1.51 $ $Name: not supported by cvs2svn $ 10 /// @date $Date: 2007-04-04 22:42:02 $ 11 11 /// 12 12 /// Copyright 2004-2007 Institute for Astronomy, University of Hawaii … … 102 102 const psVector *xShifts, 103 103 const psVector *yShifts, 104 bool tRelative,104 float totalTime, 105 105 bool xyRelative) 106 106 { … … 113 113 PS_ASSERT_VECTOR_TYPE(xShifts, PS_TYPE_S32, NULL); 114 114 PS_ASSERT_VECTOR_TYPE(yShifts, PS_TYPE_S32, NULL); 115 116 if (isnan(totalTime)) { 117 // It's more expensive to check for NAN than 0.0 118 totalTime = 0.0; 119 } 115 120 116 121 // If there are no shifts, the kernel is just a 1 at 0,0 … … 153 158 } 154 159 155 if (t Relative) {160 if (totalTime <= 0) { 156 161 tSum += tShifts->data.F32[i]; 157 162 } … … 160 165 psTrace("psLib.imageops", 5, "Kernel range: %d:%d,%d:%d\n", xMin, xMax, yMin, yMax); 161 166 162 if ( !tRelative) {167 if (totalTime > 0) { 163 168 // Then the total time is simply the final value 164 169 // NB: We assume the counter starts at zero! 165 tSum = t Shifts->data.F32[tShifts->n - 1];170 tSum = totalTime; 166 171 } 167 172 … … 181 186 } 182 187 float t = tShifts->data.F32[i]; 183 if ( !tRelative) {188 if (totalTime > 0) { 184 189 t -= tLast; 185 190 tLast = tShifts->data.F32[i]; -
trunk/psLib/src/imageops/psImageConvolve.h
r12187 r12741 5 5 * @author Robert DeSonia, MHPCC 6 6 * 7 * @version $Revision: 1.1 8$ $Name: not supported by cvs2svn $8 * @date $Date: 2007-0 3-02 22:19:21$7 * @version $Revision: 1.19 $ $Name: not supported by cvs2svn $ 8 * @date $Date: 2007-04-04 22:42:02 $ 9 9 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii 10 10 */ … … 98 98 /// 99 99 psKernel *psKernelGenerate( 100 const psVector *tShifts, ///< list of time shifts (F32)101 const psVector *xShifts, ///< list of x-axis shifts (S32)102 const psVector *yShifts, ///< list of y-axis shifts (S32)103 bool tRelative, ///< Are times relative (durations) or absolute?104 bool xyRelative ///< Are x,y positions relative (shifts) or absolute?100 const psVector *tShifts, ///< list of time shifts (F32) 101 const psVector *xShifts, ///< list of x-axis shifts (S32) 102 const psVector *yShifts, ///< list of y-axis shifts (S32) 103 float totalTime, ///< Total time (relative times if negative) 104 bool xyRelative ///< Are x,y positions relative (shifts) or absolute? 105 105 ); 106 106 -
trunk/psLib/src/imageops/psImageGeomManip.c
r12431 r12741 10 10 * @author Ross Harman, MHPCC 11 11 * 12 * @version $Revision: 1.3 8$ $Name: not supported by cvs2svn $13 * @date $Date: 2007-0 3-14 00:39:50$12 * @version $Revision: 1.39 $ $Name: not supported by cvs2svn $ 13 * @date $Date: 2007-04-04 22:42:02 $ 14 14 * 15 15 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 33 33 #include "psMemory.h" 34 34 #include "psAssert.h" 35 35 #include "psImageInterpolate.h" 36 36 #include "psCoord.h" 37 37 … … 200 200 } 201 201 202 if (mode > PS_INTERPOLATE_LANCZOS4_VARIANCE ) {203 psError(PS_ERR_BAD_PARAMETER_VALUE, true,204 _("Specified interpolation mode, %d, is unsupported."),205 mode);206 psFree(out);207 return NULL;208 }209 210 202 // create an output image of the same size 211 203 // and type … … 213 205 outCols = in->numCols * scale; 214 206 invScale = 1.0f / (float)scale; 207 208 psImageInterpolateOptions *interp = psImageInterpolateOptionsAlloc(mode, in, NULL, NULL, 0, 209 NAN, NAN, 0, 0, 0); 215 210 216 211 #define PSIMAGE_RESAMPLE_CASE(TYPE) \ … … 221 216 float inRow = (float)row * invScale; \ 222 217 for (psS32 col=0;col<outCols;col++) { \ 223 rowData[col] = psImagePixelInterpolate(in,(float)col*invScale,inRow,NULL,0,0,mode); \ 218 double value; \ 219 if (!psImageInterpolate(&value, NULL, NULL, (float)col*invScale, inRow, interp)) { \ 220 psError(PS_ERR_UNKNOWN, false, "Unable to interpolate image."); \ 221 psFree(interp); \ 222 psFree(out); \ 223 return NULL; \ 224 } \ 225 rowData[col] = value; \ 224 226 } \ 225 227 } \ … … 249 251 } 250 252 253 psFree(interp); 254 251 255 return out; 252 256 } … … 492 496 float CenterYMinusminXTimesSinT = centerY - minX * sinT; 493 497 494 #define PSIMAGE_ROTATE_ARBITRARY_LOOP(TYPE,MODE) { \ 498 psImageInterpolateOptions *interp = psImageInterpolateOptionsAlloc(mode, input, NULL, NULL, 0, 499 exposed, NAN, 0, 0, 0.0); 500 501 #define PSIMAGE_ROTATE_ARBITRARY_LOOP(TYPE) \ 502 case PS_TYPE_##TYPE: { \ 495 503 if (exposed < PS_MIN_##TYPE || \ 496 504 exposed > PS_MAX_##TYPE || \ … … 515 523 outRow = out->data.TYPE[y]; \ 516 524 for (psS32 x = 0; x < outCols; x++) { \ 517 outRow[x] = p_psImagePixelInterpolate##MODE##_##TYPE(input,inX,inY,NULL,0,exposed); \ 525 double value; \ 526 if (!psImageInterpolate(&value, NULL, NULL, inX, inY, interp)) { \ 527 psError(PS_ERR_UNKNOWN, false, "Unable to interpolate image."); \ 528 psFree(out); \ 529 psFree(interp); \ 530 return NULL; \ 531 } \ 532 outRow[x] = value; \ 518 533 inX += cosT; \ 519 534 inY -= sinT; \ 520 535 } \ 521 536 } \ 522 }523 524 #define PSIMAGE_ROTATE_ARBITRARY_CASE(MODE) \525 case PS_INTERPOLATE_##MODE: \526 switch (type) { \527 case PS_TYPE_U8: \528 PSIMAGE_ROTATE_ARBITRARY_LOOP(U8,MODE); \529 537 break; \ 530 case PS_TYPE_U16: \ 531 PSIMAGE_ROTATE_ARBITRARY_LOOP(U16,MODE); \ 532 break; \ 533 case PS_TYPE_U32: /* Not a requirement */ \ 534 PSIMAGE_ROTATE_ARBITRARY_LOOP(U32,MODE); \ 535 break; \ 536 case PS_TYPE_U64: /* Not a requirement */ \ 537 PSIMAGE_ROTATE_ARBITRARY_LOOP(U64,MODE); \ 538 break; \ 539 case PS_TYPE_S8: \ 540 PSIMAGE_ROTATE_ARBITRARY_LOOP(S8,MODE); \ 541 break; \ 542 case PS_TYPE_S16: \ 543 PSIMAGE_ROTATE_ARBITRARY_LOOP(S16,MODE); \ 544 break; \ 545 case PS_TYPE_S32: /* Not a requirement */ \ 546 PSIMAGE_ROTATE_ARBITRARY_LOOP(S32,MODE); \ 547 break; \ 548 case PS_TYPE_S64: /* Not a requirement */ \ 549 PSIMAGE_ROTATE_ARBITRARY_LOOP(S64,MODE); \ 550 break; \ 551 case PS_TYPE_F32: \ 552 PSIMAGE_ROTATE_ARBITRARY_LOOP(F32,MODE); \ 553 break; \ 554 case PS_TYPE_F64: \ 555 PSIMAGE_ROTATE_ARBITRARY_LOOP(F64,MODE); \ 556 break; \ 557 default: { \ 558 char* typeStr; \ 559 PS_TYPE_NAME(typeStr,type); \ 560 psError(PS_ERR_BAD_PARAMETER_TYPE, true, \ 561 _("Specified psImage type, %s, is not supported."), \ 562 typeStr); \ 563 psFree(out); \ 564 out = NULL; \ 565 } \ 566 } \ 567 break; 568 569 switch (mode) { 570 PSIMAGE_ROTATE_ARBITRARY_CASE(FLAT); 571 PSIMAGE_ROTATE_ARBITRARY_CASE(BILINEAR); 572 PSIMAGE_ROTATE_ARBITRARY_CASE(BILINEAR_VARIANCE); 573 default: 574 psError(PS_ERR_BAD_PARAMETER_VALUE, true, 575 _("Specified interpolation mode, %d, is unsupported."), 576 mode); 577 psFree(out); 578 out = NULL; 579 } 538 } 539 540 switch (type) { 541 PSIMAGE_ROTATE_ARBITRARY_LOOP(U8); 542 PSIMAGE_ROTATE_ARBITRARY_LOOP(U16); 543 PSIMAGE_ROTATE_ARBITRARY_LOOP(U32); 544 PSIMAGE_ROTATE_ARBITRARY_LOOP(U64); 545 PSIMAGE_ROTATE_ARBITRARY_LOOP(S8); 546 PSIMAGE_ROTATE_ARBITRARY_LOOP(S16); 547 PSIMAGE_ROTATE_ARBITRARY_LOOP(S32); 548 PSIMAGE_ROTATE_ARBITRARY_LOOP(S64); 549 PSIMAGE_ROTATE_ARBITRARY_LOOP(F32); 550 PSIMAGE_ROTATE_ARBITRARY_LOOP(F64); 551 default: { 552 char* typeStr; 553 PS_TYPE_NAME(typeStr,type); 554 psError(PS_ERR_BAD_PARAMETER_TYPE, true, 555 _("Specified psImage type, %s, is not supported."), 556 typeStr); 557 psFree(out); 558 psFree(interp); 559 out = NULL; 560 } 561 } 562 563 psFree(interp); 564 580 565 } 581 566 … … 695 680 out = psImageRecycle(out, outCols, outRows, type); 696 681 697 #define PSIMAGE_SHIFT_CASE(MODE,TYPE) \ 682 psImageInterpolateOptions *interp = psImageInterpolateOptionsAlloc(mode, input, NULL, NULL, 0, 683 exposed, NAN, 0, 0, 0.0); 684 685 #define PSIMAGE_SHIFT_CASE(TYPE) \ 698 686 case PS_TYPE_##TYPE: \ 699 687 if (exposed < PS_MIN_##TYPE || \ … … 719 707 for (psS32 col=0;col<outCols;col++) { \ 720 708 float x = col + 0.5 - dx; \ 721 outRow[col] = p_psImagePixelInterpolate##MODE##_##TYPE( \ 722 input,x,y,NULL,0,exposed); \ 709 double value; \ 710 if (!psImageInterpolate(&value, NULL, NULL, x, y, interp)) { \ 711 psError(PS_ERR_UNKNOWN, false, "Unable to interpolate image."); \ 712 psFree(interp); \ 713 psFree(out); \ 714 return NULL; \ 715 } \ 716 outRow[col] = value; \ 723 717 } \ 724 718 } \ 725 719 break; 726 720 727 #define PSIMAGE_SHIFT_ARBITRARY_CASE(MODE) \ 728 case PS_INTERPOLATE_##MODE: \ 729 switch (input->type.type) { \ 730 PSIMAGE_SHIFT_CASE(MODE,U8); \ 731 PSIMAGE_SHIFT_CASE(MODE,U16); \ 732 PSIMAGE_SHIFT_CASE(MODE,U32); /* Not a requirement */ \ 733 PSIMAGE_SHIFT_CASE(MODE,U64); /* Not a requirement */ \ 734 PSIMAGE_SHIFT_CASE(MODE,S8); \ 735 PSIMAGE_SHIFT_CASE(MODE,S16); \ 736 PSIMAGE_SHIFT_CASE(MODE,S32); /* Not a requirement */ \ 737 PSIMAGE_SHIFT_CASE(MODE,S64); /* Not a requirement */ \ 738 PSIMAGE_SHIFT_CASE(MODE,F32); \ 739 PSIMAGE_SHIFT_CASE(MODE,F64); \ 740 \ 741 default: { \ 742 char* typeStr; \ 743 PS_TYPE_NAME(typeStr,type); \ 744 psError(PS_ERR_BAD_PARAMETER_TYPE, true, \ 745 _("Specified psImage type, %s, is not supported."), \ 746 typeStr); \ 747 psFree(out); \ 748 out = NULL; \ 749 } \ 750 } \ 751 break; 752 753 // EAM: added BICUBE 754 switch (mode) { 755 PSIMAGE_SHIFT_ARBITRARY_CASE(FLAT); 756 PSIMAGE_SHIFT_ARBITRARY_CASE(BILINEAR); 757 PSIMAGE_SHIFT_ARBITRARY_CASE(BILINEAR_VARIANCE); 758 PSIMAGE_SHIFT_ARBITRARY_CASE(BICUBE); 759 default: 760 psError(PS_ERR_BAD_PARAMETER_VALUE, true, 761 _("Specified interpolation mode, %d, is unsupported."), 762 mode); 763 psFree(out); 764 out = NULL; 765 } 766 721 switch (input->type.type) { 722 PSIMAGE_SHIFT_CASE(U8); 723 PSIMAGE_SHIFT_CASE(U16); 724 PSIMAGE_SHIFT_CASE(U32); 725 PSIMAGE_SHIFT_CASE(U64); 726 PSIMAGE_SHIFT_CASE(S8); 727 PSIMAGE_SHIFT_CASE(S16); 728 PSIMAGE_SHIFT_CASE(S32); 729 PSIMAGE_SHIFT_CASE(S64); 730 PSIMAGE_SHIFT_CASE(F32); 731 PSIMAGE_SHIFT_CASE(F64); 732 default: { 733 char* typeStr; 734 PS_TYPE_NAME(typeStr,type); 735 psError(PS_ERR_BAD_PARAMETER_TYPE, true, _("Specified psImage type, %s, is not supported."), 736 typeStr); 737 psFree(out); 738 psFree(interp); 739 return NULL; 740 } 741 } 742 743 psFree(interp); 767 744 return out; 768 745 } … … 866 843 867 844 // loop through the output image using the domain above and transform 868 // each output pixel to input coordinates and use psImage PixelInterpolate845 // each output pixel to input coordinates and use psImageInterpolate 869 846 // to determine the pixel value. 870 847 psPlane outPosition; 871 848 psPlane* inPosition = NULL; 872 849 873 #define PSIMAGE_TRANSFORM_DOTRANSFORM(TYPE,MODE) \ 850 psImageInterpolateOptions *interp = psImageInterpolateOptionsAlloc(mode, input, NULL, inputMask, 851 inputMaskVal, NAN, NAN, 0, 0, 0.0); 852 853 854 #define PSIMAGE_TRANSFORM_DOTRANSFORM(TYPE) \ 874 855 /* apply the transform to get the position in the input image */ \ 875 856 inPosition = psPlaneTransformApply(inPosition, outToIn, &outPosition); \ … … 882 863 } \ 883 864 /* interpolate the cooresponding input pixel to get the output pixel value. */ \ 884 ps##TYPE value = p_psImagePixelInterpolate##MODE##_##TYPE(input, \ 885 inPosition->x, inPosition->y, \ 886 inputMask, inputMaskVal, NAN); \ 865 double value; \ 866 if (!psImageInterpolate(&value, NULL, NULL, inPosition->x, inPosition->y, interp)) { \ 867 psError(PS_ERR_UNKNOWN, false, "Unable to interpolate image."); \ 868 psFree(output); \ 869 psFree(interp); \ 870 return NULL; \ 871 } \ 887 872 /* psFree(inPosition); */\ 888 873 if (isnan(value)) { \ … … 893 878 } \ 894 879 895 #define PSIMAGE_TRANSFORM_LOOP(TYPE, MODE) { \ 880 #define PSIMAGE_TRANSFORM_CASE(TYPE) \ 881 case PS_TYPE_##TYPE: { \ 896 882 for (int row = 0; row < numRows; row++) { \ 897 883 outPosition.y = row+row0; \ … … 899 885 for (int col = 0; col < numCols; col++) { \ 900 886 outPosition.x = col+col0; \ 901 PSIMAGE_TRANSFORM_DOTRANSFORM(TYPE ,MODE) \887 PSIMAGE_TRANSFORM_DOTRANSFORM(TYPE) \ 902 888 outputData[col] = value; \ 903 889 } \ 904 890 } \ 905 }906 907 #define PSIMAGE_TRANSFORM_FROMLIST(TYPE, MODE) { \908 int n = pixels->n; \909 for (int i= 0; i < n; i++) { \910 int x = pixels->data[i].x; \911 int y = pixels->data[i].y; \912 if (x >= col0 && x < col1 && y >= row0 && y < row1) { \913 outPosition.x = x; \914 outPosition.y = y; \915 PSIMAGE_TRANSFORM_DOTRANSFORM(TYPE,MODE) \916 output->data.TYPE[y][x] = value; \917 } \918 } \919 }920 921 #define PSIMAGE_TRANSFORM_CASE(MODE) \922 case PS_INTERPOLATE_##MODE: \923 switch (type) { \924 case PS_TYPE_F32: \925 PSIMAGE_TRANSFORM_LOOP(F32,MODE); \926 891 break; \ 927 case PS_TYPE_F64: \ 928 PSIMAGE_TRANSFORM_LOOP(F64,MODE); \ 929 break; \ 930 default: { \ 931 char* typeStr; \ 932 PS_TYPE_NAME(typeStr,type); \ 933 psError(PS_ERR_BAD_PARAMETER_TYPE, true, \ 934 _("Specified psImage type, %s, is not supported."), \ 935 typeStr); \ 936 psFree(output); \ 937 return NULL; \ 938 } \ 939 } \ 940 break; 941 942 switch (mode) { 943 PSIMAGE_TRANSFORM_CASE(FLAT); 944 PSIMAGE_TRANSFORM_CASE(BILINEAR); 945 PSIMAGE_TRANSFORM_CASE(BILINEAR_VARIANCE); 946 default: 947 psError(PS_ERR_BAD_PARAMETER_VALUE, true, 948 _("Specified interpolation mode, %d, is unsupported."), 949 mode); 950 psFree(output); 951 return NULL; 892 } 893 894 switch (type) { 895 PSIMAGE_TRANSFORM_CASE(F32); 896 PSIMAGE_TRANSFORM_CASE(F64); 897 default: { 898 char* typeStr; 899 PS_TYPE_NAME(typeStr,type); 900 psError(PS_ERR_BAD_PARAMETER_TYPE, true, _("Specified psImage type, %s, is not supported."), 901 typeStr); 902 psFree(output); 903 psFree(inPosition); 904 return NULL; 905 } 952 906 } 953 907 -
trunk/psLib/src/imageops/psImageGeomManip.h
r12431 r12741 6 6 * @author Robert DeSonia, MHPCC 7 7 * 8 * @version $Revision: 1. 19$ $Name: not supported by cvs2svn $9 * @date $Date: 2007-0 3-14 00:39:50$8 * @version $Revision: 1.20 $ $Name: not supported by cvs2svn $ 9 * @date $Date: 2007-04-04 22:42:02 $ 10 10 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii 11 11 */ … … 17 17 18 18 #include "psImage.h" 19 #include "psImageInterpolate.h" 19 20 #include "psCoord.h" 20 21 #include "psStats.h" … … 158 159 * coordinates in the input image of a pixel in the output image â note that 159 160 * this is the reverse of what might be naively expected, but it is what is 160 * required in order to use psImage PixelInterpolate. If the pixels array is161 * required in order to use psImageInterpolate. If the pixels array is 161 162 * non-NULL, it shall consist of psPixelCoords, and only those pixels in the 162 163 * output image shall be transformed; otherwise, the entire image is -
trunk/psLib/src/imageops/psImagePixelExtract.c
r12431 r12741 8 8 * @author Robert DeSonia, MHPCC 9 9 * 10 * @version $Revision: 1.3 1$ $Name: not supported by cvs2svn $11 * @date $Date: 2007-0 3-14 00:39:50$10 * @version $Revision: 1.32 $ $Name: not supported by cvs2svn $ 11 * @date $Date: 2007-04-04 22:42:02 $ 12 12 * 13 13 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 23 23 #include "psMemory.h" 24 24 #include "psVector.h" 25 #include "psError.h" 26 #include "psImage.h" 27 #include "psImageInterpolate.h" 25 28 #include "psImagePixelExtract.h" 26 #include "psError.h"27 28 29 29 30 30 #define VECTOR_STORE_ROW_CASE(TYPE) \ … … 679 679 float dY = (endRow - startRow) / (float)(nSamples-1); 680 680 681 psImageInterpolateOptions *interp = psImageInterpolateOptionsAlloc(mode, input, NULL, mask, maskVal, 682 0, 0, 0, 0, 0); 683 681 684 #define LINEAR_CUT_CASE(TYPE) \ 682 685 case PS_TYPE_##TYPE: { \ … … 692 695 cutRowsData[i] = y; \ 693 696 } \ 694 outData[i] = psImagePixelInterpolate(input,x,y,mask,maskVal,0,mode); \ 697 double value; \ 698 if (!psImageInterpolate(&value, NULL, NULL, x, y, interp)) { \ 699 psError(PS_ERR_UNKNOWN, false, "Unable to interpolate image."); \ 700 psFree(interp); \ 701 psFree(out); \ 702 return NULL; \ 703 } \ 704 outData[i] = value; \ 695 705 } \ 696 706 } \ … … 709 719 LINEAR_CUT_CASE(F32); 710 720 LINEAR_CUT_CASE(F64); 711 712 default: { 713 char* typeStr; 714 PS_TYPE_NAME(typeStr,input->type.type); 715 psError(PS_ERR_BAD_PARAMETER_TYPE, true, 716 _("Specified psImage type, %s, is not supported."), 717 typeStr); 718 psFree(out); 719 out = NULL; 720 } 721 } 721 default: { 722 char* typeStr; 723 PS_TYPE_NAME(typeStr,input->type.type); 724 psError(PS_ERR_BAD_PARAMETER_TYPE, true, 725 _("Specified psImage type, %s, is not supported."), 726 typeStr); 727 psFree(interp); 728 psFree(out); 729 out = NULL; 730 } 731 } 732 733 psFree(interp); 722 734 723 735 return out;
Note:
See TracChangeset
for help on using the changeset viewer.
