Changeset 34800 for trunk/psLib
- Timestamp:
- Dec 11, 2012, 2:04:31 PM (14 years ago)
- Location:
- trunk
- Files:
-
- 4 edited
-
. (modified) (1 prop)
-
psLib/src/imageops/psImageInterpolate.c (modified) (7 diffs)
-
psLib/src/imageops/psImageInterpolate.h (modified) (1 diff)
-
psLib/src/imageops/psImagePixelManip.c (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk
-
trunk/psLib/src/imageops/psImageInterpolate.c
r34365 r34800 31 31 #include "psImageConvolve.h" 32 32 33 # define IS_BILIN_SEPARABLE 033 # define IS_BILIN_SEPARABLE 1 34 34 35 35 #include "psImageInterpolate.h" … … 189 189 switch (mode) { 190 190 case PS_INTERPOLATE_FLAT: 191 case PS_INTERPOLATE_BILINEAR_SIMPLE: 191 192 // Nothing to pre-compute 192 193 break; … … 287 288 # endif 288 289 case PS_INTERPOLATE_BIQUADRATIC: 290 case PS_INTERPOLATE_BILINEAR_SIMPLE: 289 291 // 2D kernel, would cost too much memory to pre-calculate 290 292 break; 293 291 294 default: 292 295 psAbort("Unsupported interpolation mode: %x", mode); … … 937 940 938 941 942 psImageInterpolateStatus interpolateJustWork(double *imageValue, double *varianceValue, 943 psImageMaskType *maskValue, float x, float y, 944 const psImageInterpolation *interp) { 945 float u1,u2; 946 int xl,xh; 947 int yl,yh; 948 const psImage *image = interp->image; // Image to interpolate 949 950 xl = floor(x); 951 if (xl < 0) { xl = 0; } 952 if (xl >= image->numCols) {xl = image->numCols - 1; } 953 xh = xl + 1; 954 if (xh >= image->numCols) {xh = image->numCols - 1; } 955 956 yl = floor(y); 957 if (yl < 0) { yl = 0; } 958 if (yl >= image->numRows) {yl = image->numRows - 1; } 959 yh = yl + 1; 960 if (yh >= image->numRows) {yh = image->numRows - 1; } 961 962 if (imageValue && image) { 963 if (image->data.F32[yl][xl] == image->data.F32[yl][xh]) { 964 u1 = image->data.F32[yl][xh]; 965 } 966 else { 967 u1 = (xh - x) * image->data.F32[yl][xl] + (x - xl) * image->data.F32[yl][xh]; 968 } 969 if (image->data.F32[yh][xl] == image->data.F32[yh][xh]) { 970 u2 = image->data.F32[yh][xh]; 971 } 972 else { 973 u2 = (xh - x) * image->data.F32[yh][xl] + (x - xl) * image->data.F32[yh][xh]; 974 } 975 if (u1 == u2) { 976 *imageValue = u1; 977 } 978 else { 979 *imageValue = (yh - y) * u1 + (y - yl) * u2; 980 } 981 if ((floor(x) >= image->numCols)|| 982 (floor(y) >= image->numRows)) { 983 *imageValue = NAN; 984 } 985 } 986 #if (0) 987 if (*imageValue == 0.0) { 988 fprintf(stderr,"IJK: Zero!: %g %g [%d %d %d %d] %g %g (%g %g %g %g)\n", 989 x,y,xl,xh,yl,yh,u1,u2, 990 image->data.F32[yl][xl],image->data.F32[yl][xh],image->data.F32[yh][xl],image->data.F32[yh][xh] 991 ); 992 } 993 #endif 994 return PS_INTERPOLATE_STATUS_GOOD; 995 } 996 939 997 940 998 psImageInterpolateStatus psImageInterpolate(double *imageValue, double *varianceValue, … … 969 1027 case PS_INTERPOLATE_BIQUADRATIC: 970 1028 return interpolateKernel(imageValue, varianceValue, maskValue, x, y, interp); 1029 case PS_INTERPOLATE_BILINEAR_SIMPLE: 1030 return interpolateJustWork(imageValue, varianceValue, maskValue, x, y, interp); 971 1031 case PS_INTERPOLATE_BILINEAR: 972 1032 # if (!IS_BILIN_SEPARABLE) 973 return interpolateKernel(imageValue, varianceValue, maskValue, x, y, interp);1033 return interpolateKernel(imageValue, varianceValue, maskValue, x, y, interp); 974 1034 # endif 975 1035 case PS_INTERPOLATE_GAUSS: … … 1019 1079 switch (mode) { 1020 1080 case PS_INTERPOLATE_FLAT: 1081 case PS_INTERPOLATE_BILINEAR_SIMPLE: 1021 1082 // No smearing by design 1022 1083 return 1.0; … … 1083 1144 if (!strcasecmp(name, "FLAT")) return PS_INTERPOLATE_FLAT; 1084 1145 if (!strcasecmp(name, "BILINEAR")) return PS_INTERPOLATE_BILINEAR; 1146 if (!strcasecmp(name, "SIMPLEBILINEAR")) return PS_INTERPOLATE_BILINEAR_SIMPLE; 1085 1147 if (!strcasecmp(name, "BIQUADRATIC")) return PS_INTERPOLATE_BIQUADRATIC; 1086 1148 if (!strcasecmp(name, "GAUSS")) return PS_INTERPOLATE_GAUSS; -
trunk/psLib/src/imageops/psImageInterpolate.h
r21281 r34800 33 33 PS_INTERPOLATE_LANCZOS3, ///< Sinc interpolation with 6x6 pixel kernel 34 34 PS_INTERPOLATE_LANCZOS4, ///< Sinc interpolation with 8x8 pixel kernel 35 PS_INTERPOLATE_BILINEAR_SIMPLE, ///< Simple manual bilinear interpolation 35 36 } psImageInterpolateMode; 36 37 -
trunk/psLib/src/imageops/psImagePixelManip.c
r12953 r34800 216 216 } 217 217 218 218 #define psImageOverlayLoopClean(DATATYPE,OP) { \ 219 for (int row=y0;row<imageRowLimit;row++) { \ 220 ps##DATATYPE* imageRow = image->data.DATATYPE[row]; \ 221 ps##DATATYPE* overlayRow = overlay->data.DATATYPE[row-y0]; \ 222 for (int col=x0;col<imageColLimit;col++) { \ 223 if (!isfinite(imageRow[col])) { \ 224 imageRow[col] OP overlayRow[col-x0]; \ 225 } \ 226 else if (!isfinite(overlayRow[col-x0])) { \ 227 imageRow[col] = imageRow[col]; \ 228 } \ 229 else { \ 230 imageRow[col] = overlayRow[col-x0]; \ 231 } \ 232 } \ 233 } \ 234 pixelsOverlaid += (imageRowLimit - y0) * (imageColLimit - x0); \ 235 } 236 237 #define psImageOverlayLoopMask(DATATYPE) { \ 238 for (int row=y0;row<imageRowLimit;row++) { \ 239 ps##DATATYPE* imageRow = image->data.DATATYPE[row]; \ 240 ps##DATATYPE* overlayRow = overlay->data.DATATYPE[row-y0]; \ 241 for (int col=x0;col<imageColLimit;col++) { \ 242 if (!isfinite(imageRow[col])) { \ 243 imageRow[col] = overlayRow[col-x0]; \ 244 } \ 245 else if (!isfinite(overlayRow[col-x0])) { \ 246 imageRow[col] = imageRow[col]; \ 247 } \ 248 else { \ 249 imageRow[col] &= overlayRow[col-x0]; \ 250 } \ 251 } \ 252 } \ 253 pixelsOverlaid += (imageRowLimit - y0) * (imageColLimit - x0); \ 254 } 255 256 257 219 258 #define psImageOverlayLoop(DATATYPE,OP) { \ 220 259 for (int row=y0;row<imageRowLimit;row++) { \ 221 260 ps##DATATYPE* imageRow = image->data.DATATYPE[row]; \ 222 261 ps##DATATYPE* overlayRow = overlay->data.DATATYPE[row-y0]; \ 223 for (int col=x0;col<imageColLimit;col++) { \224 imageRow[col] OP overlayRow[col-x0]; \225 }\226 } \262 for (int col=x0;col<imageColLimit;col++) { \ 263 imageRow[col] OP overlayRow[col-x0]; \ 264 } \ 265 } \ 227 266 pixelsOverlaid += (imageRowLimit - y0) * (imageColLimit - x0); \ 228 }267 } 229 268 230 269 #define psImageOverlayLoopDivide(DATATYPE,BADVALUE) { \ … … 273 312 psImageOverlayLoop(DATATYPE,*=); \ 274 313 break; \ 314 case 'E': \ 315 psImageOverlayLoopClean(DATATYPE,=); \ 316 break; \ 275 317 case '/': \ 276 318 psImageOverlayLoopDivide(DATATYPE,BADVALUE); \ 277 319 break; \ 278 320 case '=': \ 279 psImageOverlaySetLoop(DATATYPE); \321 psImageOverlaySetLoop(DATATYPE); \ 280 322 break; \ 281 323 default: \ … … 286 328 } \ 287 329 break; 330 #define psImageOverlayCaseInt(DATATYPE,BADVALUE) \ 331 case PS_TYPE_##DATATYPE: \ 332 switch (*op) { \ 333 case '+': \ 334 psImageOverlayLoop(DATATYPE,+=); \ 335 break; \ 336 case '-': \ 337 psImageOverlayLoop(DATATYPE,-=); \ 338 break; \ 339 case '*': \ 340 psImageOverlayLoop(DATATYPE,*=); \ 341 break; \ 342 case 'E': \ 343 psImageOverlayLoopClean(DATATYPE,=); \ 344 break; \ 345 case 'M': \ 346 psImageOverlayLoopMask(DATATYPE); \ 347 break; \ 348 case '/': \ 349 psImageOverlayLoopDivide(DATATYPE,BADVALUE); \ 350 break; \ 351 case '=': \ 352 psImageOverlaySetLoop(DATATYPE); \ 353 break; \ 354 default: \ 355 psError(PS_ERR_BAD_PARAMETER_VALUE, true, \ 356 _("Specified operation, '%s', is not supported."), \ 357 op); \ 358 return pixelsOverlaid; \ 359 } \ 360 break; 288 361 289 362 switch (type) { 290 psImageOverlayCase (U8, 0);291 psImageOverlayCase (U16,0);292 psImageOverlayCase (U32,0); // Not a requirement293 psImageOverlayCase (U64,0); // Not a requirement294 psImageOverlayCase (S8, 0);295 psImageOverlayCase (S16,0);296 psImageOverlayCase (S32,0); // Not a requirement297 psImageOverlayCase (S64,0); // Not a requirement363 psImageOverlayCaseInt(U8, 0); 364 psImageOverlayCaseInt(U16,0); 365 psImageOverlayCaseInt(U32,0); // Not a requirement 366 psImageOverlayCaseInt(U64,0); // Not a requirement 367 psImageOverlayCaseInt(S8, 0); 368 psImageOverlayCaseInt(S16,0); 369 psImageOverlayCaseInt(S32,0); // Not a requirement 370 psImageOverlayCaseInt(S64,0); // Not a requirement 298 371 psImageOverlayCase(F32,NAN); 299 372 psImageOverlayCase(F64,NAN);
Note:
See TracChangeset
for help on using the changeset viewer.
