Changeset 21183 for trunk/psLib/src/imageops/psImageConvolve.c
- Timestamp:
- Jan 26, 2009, 8:40:07 PM (17 years ago)
- File:
-
- 1 edited
-
trunk/psLib/src/imageops/psImageConvolve.c (modified) (45 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/imageops/psImageConvolve.c
r20830 r21183 7 7 /// @author Eugene Magnier, IfA 8 8 /// 9 /// @version $Revision: 1.8 1$ $Name: not supported by cvs2svn $10 /// @date $Date: 200 8-11-26 00:43:12$9 /// @version $Revision: 1.82 $ $Name: not supported by cvs2svn $ 10 /// @date $Date: 2009-01-27 06:39:37 $ 11 11 /// 12 12 /// Copyright 2004-2007 Institute for Astronomy, University of Hawaii … … 319 319 } 320 320 321 psImage *psImageConvolveMaskDirect(psImage *out, const psImage *mask, ps MaskType maskVal,322 ps MaskType setVal, int xMin, int xMax, int yMin, int yMax)321 psImage *psImageConvolveMaskDirect(psImage *out, const psImage *mask, psImageMaskType maskVal, 322 psImageMaskType setVal, int xMin, int xMax, int yMin, int yMax) 323 323 { 324 324 PS_ASSERT_IMAGE_NON_NULL(mask, NULL); 325 PS_ASSERT_IMAGE_TYPE(mask, PS_TYPE_ MASK, NULL);325 PS_ASSERT_IMAGE_TYPE(mask, PS_TYPE_IMAGE_MASK, NULL); 326 326 if (out == mask && ((maskVal & setVal) || !setVal)) { 327 327 psError(PS_ERR_BAD_PARAMETER_VALUE, true, … … 352 352 if (!out) { 353 353 // Propagate the non-masked values 354 out = (psImage*)psBinaryOp(NULL, (const psPtr)mask, "&", psScalarAlloc(~maskVal, PS_TYPE_ MASK));354 out = (psImage*)psBinaryOp(NULL, (const psPtr)mask, "&", psScalarAlloc(~maskVal, PS_TYPE_IMAGE_MASK)); 355 355 } 356 356 357 357 // Dereference mask images 358 ps MaskType **maskData = mask->data.PS_TYPE_MASK_DATA;359 ps MaskType **outData = out->data.PS_TYPE_MASK_DATA;358 psImageMaskType **maskData = mask->data.PS_TYPE_IMAGE_MASK_DATA; 359 psImageMaskType **outData = out->data.PS_TYPE_IMAGE_MASK_DATA; 360 360 361 361 if (setVal) { … … 376 376 for (int row = 0; row < numRows; row++) { 377 377 for (int col = 0; col < numCols; col++) { 378 ps MaskType pixel = outData[row][col]; // Pixel value to set378 psImageMaskType pixel = outData[row][col]; // Pixel value to set 379 379 if (pixel & maskVal) { 380 380 // Already done this one … … 395 395 396 396 397 psImage *psImageConvolveMaskFFT(psImage *out, const psImage *mask, ps MaskType maskVal,398 ps MaskType setVal, int xMin, int xMax, int yMin, int yMax, float thresh)397 psImage *psImageConvolveMaskFFT(psImage *out, const psImage *mask, psImageMaskType maskVal, 398 psImageMaskType setVal, int xMin, int xMax, int yMin, int yMax, float thresh) 399 399 { 400 400 PS_ASSERT_IMAGE_NON_NULL(mask, NULL); 401 PS_ASSERT_IMAGE_TYPE(mask, PS_TYPE_ MASK, NULL);401 PS_ASSERT_IMAGE_TYPE(mask, PS_TYPE_IMAGE_MASK, NULL); 402 402 PS_ASSERT_FLOAT_LARGER_THAN(thresh, 0.0, NULL); 403 403 PS_ASSERT_FLOAT_LESS_THAN(thresh, 1.0, NULL); … … 431 431 for (int y = 0; y < numRows; y++) { 432 432 for (int x = 0; x < numCols; x++) { 433 if (mask->data.PS_TYPE_ MASK_DATA[y][x] & maskVal) {433 if (mask->data.PS_TYPE_IMAGE_MASK_DATA[y][x] & maskVal) { 434 434 onoff->data.F32[y][x] = 1.0; 435 435 } … … 452 452 453 453 if (!out) { 454 out = psImageAlloc(numCols, numRows, PS_TYPE_ MASK);454 out = psImageAlloc(numCols, numRows, PS_TYPE_IMAGE_MASK); 455 455 } 456 456 for (int y = 0; y < numRows; y++) { 457 457 for (int x = 0; x < numCols; x++) { 458 out->data.PS_TYPE_ MASK_DATA[y][x] = (convolved->data.F32[y][x] >= thresh) ?459 (mask->data.PS_TYPE_ MASK_DATA[y][x] | setVal) : mask->data.PS_TYPE_MASK_DATA[y][x];458 out->data.PS_TYPE_IMAGE_MASK_DATA[y][x] = (convolved->data.F32[y][x] >= thresh) ? 459 (mask->data.PS_TYPE_IMAGE_MASK_DATA[y][x] | setVal) : mask->data.PS_TYPE_IMAGE_MASK_DATA[y][x]; 460 460 } 461 461 } … … 651 651 case PS_TYPE_##TYPE: { \ 652 652 psImage *calculation = psImageAlloc(numRows, numCols, PS_TYPE_##TYPE); /* Calculation image; BW */ \ 653 psImage *calcMask = psImageAlloc(numRows, numCols, PS_TYPE_ MASK); /* Mask for calculation image; BW */ \653 psImage *calcMask = psImageAlloc(numRows, numCols, PS_TYPE_IMAGE_MASK); /* Mask for calculation image; BW */ \ 654 654 \ 655 655 /** Smooth in X direction **/ \ … … 658 658 int xMin = PS_MAX(i - size, 0); \ 659 659 int xMax = PS_MIN(i + size, xLast); \ 660 const ps MaskType *maskData = &mask->data.PS_TYPE_MASK_DATA[j][xMin]; \660 const psImageMaskType *maskData = &mask->data.PS_TYPE_IMAGE_MASK_DATA[j][xMin]; \ 661 661 const ps##TYPE *imageData = &image->data.TYPE[j][xMin]; \ 662 662 int uMin = - PS_MIN(i, size); /* Minimum kernel index */ \ … … 673 673 /* BW */ \ 674 674 calculation->data.TYPE[i][j] = sumIG / sumG; \ 675 calcMask->data.PS_TYPE_ MASK_DATA[i][j] = 0; \675 calcMask->data.PS_TYPE_IMAGE_MASK_DATA[i][j] = 0; \ 676 676 } else { \ 677 677 /* BW */ \ 678 calcMask->data.PS_TYPE_ MASK_DATA[i][j] = 0xFF; \678 calcMask->data.PS_TYPE_IMAGE_MASK_DATA[i][j] = 0xFF; \ 679 679 } \ 680 680 } \ … … 688 688 int yMin = PS_MAX(j - size, 0); \ 689 689 int yMax = PS_MIN(j + size, yLast); \ 690 const ps MaskType *maskData = &calcMask->data.PS_TYPE_MASK_DATA[i][yMin]; /* BW */ \690 const psImageMaskType *maskData = &calcMask->data.PS_TYPE_IMAGE_MASK_DATA[i][yMin]; /* BW */ \ 691 691 const ps##TYPE *imageData = &calculation->data.TYPE[i][yMin]; /* BW */ \ 692 692 int vMin = - PS_MIN(j, size); /* Minimum kernel index */ \ … … 714 714 const psImage *image, 715 715 const psImage *mask, 716 ps MaskType maskVal,716 psImageMaskType maskVal, 717 717 float sigma, 718 718 float numSigma, … … 721 721 PS_ASSERT_IMAGE_NON_NULL(image, NULL); 722 722 PS_ASSERT_IMAGE_NON_NULL(mask, NULL); 723 PS_ASSERT_IMAGE_TYPE(mask, PS_TYPE_ MASK, NULL);723 PS_ASSERT_IMAGE_TYPE(mask, PS_TYPE_IMAGE_MASK, NULL); 724 724 PS_ASSERT_IMAGES_SIZE_EQUAL(image, mask, NULL); 725 725 … … 751 751 case PS_TYPE_F32: { 752 752 psImage *calculation = psImageAlloc(numRows, numCols, PS_TYPE_F32); /* Calculation image; BW */ 753 psImage *calcMask = psImageAlloc(numRows, numCols, PS_TYPE_ MASK); /* Mask for calculation image; BW */753 psImage *calcMask = psImageAlloc(numRows, numCols, PS_TYPE_IMAGE_MASK); /* Mask for calculation image; BW */ 754 754 755 755 /** Smooth in X direction **/ … … 758 758 int xMin = PS_MAX(i - size, 0); 759 759 int xMax = PS_MIN(i + size, xLast); 760 const ps MaskType *maskData = &mask->data.PS_TYPE_MASK_DATA[j][xMin];760 const psImageMaskType *maskData = &mask->data.PS_TYPE_IMAGE_MASK_DATA[j][xMin]; 761 761 const psF32 *imageData = &image->data.F32[j][xMin]; 762 762 int uMin = - PS_MIN(i, size); /* Minimum kernel index */ … … 776 776 /* BW */ 777 777 calculation->data.F32[i][j] = sumIG / sumG; 778 calcMask->data.PS_TYPE_ MASK_DATA[i][j] = 0;778 calcMask->data.PS_TYPE_IMAGE_MASK_DATA[i][j] = 0; 779 779 } else { 780 780 /* BW */ 781 calcMask->data.PS_TYPE_ MASK_DATA[i][j] = 0xFF;781 calcMask->data.PS_TYPE_IMAGE_MASK_DATA[i][j] = 0xFF; 782 782 } 783 783 } … … 791 791 int yMin = PS_MAX(j - size, 0); 792 792 int yMax = PS_MIN(j + size, yLast); 793 const ps MaskType *maskData = &calcMask->data.PS_TYPE_MASK_DATA[i][yMin]; /* BW */793 const psImageMaskType *maskData = &calcMask->data.PS_TYPE_IMAGE_MASK_DATA[i][yMin]; /* BW */ 794 794 const psF32 *imageData = &calculation->data.F32[i][yMin]; /* BW */ 795 795 int vMin = - PS_MIN(j, size); /* Minimum kernel index */ … … 832 832 const psImage *image, 833 833 const psImage *mask, 834 ps MaskType maskVal,834 psImageMaskType maskVal, 835 835 psVector *gaussNorm, 836 836 float minGauss, … … 848 848 int xMin = PS_MAX(i - size, 0); 849 849 int xMax = PS_MIN(i + size, xLast); 850 const ps MaskType *maskData = &mask->data.PS_TYPE_MASK_DATA[j][xMin];850 const psImageMaskType *maskData = &mask->data.PS_TYPE_IMAGE_MASK_DATA[j][xMin]; 851 851 const psF32 *imageData = &image->data.F32[j][xMin]; 852 852 int uMin = - PS_MIN(i, size); /* Minimum kernel index */ … … 863 863 /* BW */ 864 864 calculation->data.F32[i][j] = sumIG / sumG; 865 calcMask->data.PS_TYPE_ MASK_DATA[i][j] = 0;865 calcMask->data.PS_TYPE_IMAGE_MASK_DATA[i][j] = 0; 866 866 } else { 867 867 /* BW */ 868 calcMask->data.PS_TYPE_ MASK_DATA[i][j] = 0xFF;868 calcMask->data.PS_TYPE_IMAGE_MASK_DATA[i][j] = 0xFF; 869 869 } 870 870 } … … 876 876 psImage *calculation, 877 877 psImage *calcMask, 878 ps MaskType maskVal,878 psImageMaskType maskVal, 879 879 psVector *gaussNorm, 880 880 float minGauss, … … 892 892 int yMin = PS_MAX(j - size, 0); 893 893 int yMax = PS_MIN(j + size, yLast); 894 const ps MaskType *maskData = &calcMask->data.PS_TYPE_MASK_DATA[i][yMin]; /* BW */894 const psImageMaskType *maskData = &calcMask->data.PS_TYPE_IMAGE_MASK_DATA[i][yMin]; /* BW */ 895 895 const psF32 *imageData = &calculation->data.F32[i][yMin]; /* BW */ 896 896 int vMin = - PS_MIN(j, size); /* Minimum kernel index */ … … 921 921 const psImage *mask = job->args->data[3]; // input mask 922 922 923 ps MaskType maskVal = PS_SCALAR_VALUE(job->args->data[4],U8);923 psImageMaskType maskVal = PS_SCALAR_VALUE(job->args->data[4],PS_TYPE_IMAGE_MASK_DATA); 924 924 psVector *gaussNorm = job->args->data[5]; // gauss kernel 925 925 float minGauss = PS_SCALAR_VALUE(job->args->data[6],F32); … … 941 941 psImage *calculation = job->args->data[1]; // calculation image 942 942 psImage *calcMask = job->args->data[2]; // calculation mask 943 ps MaskType maskVal = PS_SCALAR_VALUE(job->args->data[3],U8);943 psImageMaskType maskVal = PS_SCALAR_VALUE(job->args->data[3],PS_TYPE_IMAGE_MASK_DATA); 944 944 945 945 psVector *gaussNorm = job->args->data[4]; // gauss kernel … … 956 956 const psImage *image, 957 957 const psImage *mask, 958 ps MaskType maskVal,958 psImageMaskType maskVal, 959 959 float sigma, 960 960 float numSigma, … … 963 963 PS_ASSERT_IMAGE_NON_NULL(image, NULL); 964 964 PS_ASSERT_IMAGE_NON_NULL(mask, NULL); 965 PS_ASSERT_IMAGE_TYPE(mask, PS_TYPE_ MASK, NULL);965 PS_ASSERT_IMAGE_TYPE(mask, PS_TYPE_IMAGE_MASK, NULL); 966 966 PS_ASSERT_IMAGES_SIZE_EQUAL(image, mask, NULL); 967 967 … … 999 999 case PS_TYPE_F32: { 1000 1000 psImage *calculation = psImageAlloc(numRows, numCols, PS_TYPE_F32); /* Calculation image; BW */ 1001 psImage *calcMask = psImageAlloc(numRows, numCols, PS_TYPE_ MASK); /* Mask for calculation image; BW */1001 psImage *calcMask = psImageAlloc(numRows, numCols, PS_TYPE_IMAGE_MASK); /* Mask for calculation image; BW */ 1002 1002 1003 1003 /** Smooth in X direction **/ … … 1011 1011 psArrayAdd(job->args, 1, (psImage *) image); // cast away const 1012 1012 psArrayAdd(job->args, 1, (psImage *) mask); // cast away const 1013 PS_ARRAY_ADD_SCALAR(job->args, maskVal, PS_TYPE_ U8);1013 PS_ARRAY_ADD_SCALAR(job->args, maskVal, PS_TYPE_IMAGE_MASK); 1014 1014 psArrayAdd(job->args, 1, gaussNorm); 1015 1015 PS_ARRAY_ADD_SCALAR(job->args, minGauss, PS_TYPE_F32); … … 1046 1046 psArrayAdd(job->args, 1, calculation); 1047 1047 psArrayAdd(job->args, 1, calcMask); 1048 PS_ARRAY_ADD_SCALAR(job->args, maskVal, PS_TYPE_ U8);1048 PS_ARRAY_ADD_SCALAR(job->args, maskVal, PS_TYPE_IMAGE_MASK); 1049 1049 psArrayAdd(job->args, 1, gaussNorm); 1050 1050 PS_ARRAY_ADD_SCALAR(job->args, minGauss, PS_TYPE_F32); … … 1091 1091 bool psImageSmoothMaskF32 (psImage *image, 1092 1092 psImage *mask, 1093 ps MaskType maskVal,1093 psImageMaskType maskVal, 1094 1094 double sigma, 1095 1095 double Nsigma) … … 1122 1122 psVector *calculation = psVectorAlloc(Nx, PS_TYPE_F32); 1123 1123 for (int j = 0; j < Ny; j++) { 1124 ps U8 *vm = mask->data.U8[j];1124 psImageMaskType *vm = mask->data.PS_TYPE_IMAGE_MASK_DATA[j]; 1125 1125 psF32 *vi = image->data.F32[j]; 1126 1126 psF32 *vo = calculation->data.F32; … … 1128 1128 for (int i = 0; i < Nx; i++, vi++, vo++, vm++) { 1129 1129 int offset = PS_MIN (i, Nrange); 1130 ps U8*sm = vm - offset;1130 psImageMaskType *sm = vm - offset; 1131 1131 psF32 *si = vi - offset; 1132 1132 psF32 *sg = gauss - offset; … … 1171 1171 int yMax = PS_MIN (j + Nrange + 1, Ny); 1172 1172 for (int n = yMin; n < yMax; n++) { 1173 ps U8 *vm = mask->data.U8[n];1173 psImageMaskType *vm = mask->data.PS_TYPE_IMAGE_MASK_DATA[n]; 1174 1174 psF32 *vi = image->data.F32[n]; 1175 1175 psF32 *vo = output->data.F32; … … 1214 1214 const psImage *input, // Input image 1215 1215 int start, int stop, // Range of rows 1216 ps MaskType maskVal, // Value to mask; NOTE subtle difference!1216 psImageMaskType maskVal, // Value to mask; NOTE subtle difference! 1217 1217 int xMin, int xMax // Range in x for kernel 1218 1218 ) 1219 1219 { 1220 1220 // Dereference mask images 1221 ps MaskType **inputData = input->data.PS_TYPE_MASK_DATA;1222 ps MaskType **targetData = target->data.PS_TYPE_MASK_DATA;1221 psImageMaskType **inputData = input->data.PS_TYPE_IMAGE_MASK_DATA; 1222 psImageMaskType **targetData = target->data.PS_TYPE_IMAGE_MASK_DATA; 1223 1223 1224 1224 int numCols = input->numCols; // Number of columns … … 1241 1241 min = PS_MAX(0, min); 1242 1242 max = PS_MIN(numCols - 1, max); 1243 memset(&targetData[y][min], 0xff, (max - min + 1) * PSELEMTYPE_SIZEOF(PS_TYPE_ MASK));1243 memset(&targetData[y][min], 0xff, (max - min + 1) * PSELEMTYPE_SIZEOF(PS_TYPE_IMAGE_MASK)); 1244 1244 } 1245 1245 } … … 1247 1247 // Mask from the minimum to the end of the row 1248 1248 min = PS_MAX(0, min); 1249 memset(&targetData[y][min], 0xff, (numCols - min) * PSELEMTYPE_SIZEOF(PS_TYPE_ MASK));1249 memset(&targetData[y][min], 0xff, (numCols - min) * PSELEMTYPE_SIZEOF(PS_TYPE_IMAGE_MASK)); 1250 1250 } 1251 1251 } … … 1256 1256 const psImage *input, // Input image 1257 1257 int start, int stop, // Range of rows 1258 ps MaskType setVal, // Value to set; NOTE subtle difference!1258 psImageMaskType setVal, // Value to set; NOTE subtle difference! 1259 1259 int yMin, int yMax // Range in y for kernel 1260 1260 ) 1261 1261 { 1262 1262 // Dereference mask images 1263 ps MaskType **inputData = input->data.PS_TYPE_MASK_DATA;1264 ps MaskType **targetData = target->data.PS_TYPE_MASK_DATA;1263 psImageMaskType **inputData = input->data.PS_TYPE_IMAGE_MASK_DATA; 1264 psImageMaskType **targetData = target->data.PS_TYPE_IMAGE_MASK_DATA; 1265 1265 1266 1266 int numRows = input->numRows; // Number of rows … … 1308 1308 int start = PS_SCALAR_VALUE(args->data[2], S32); // Row/col to start at 1309 1309 int stop = PS_SCALAR_VALUE(args->data[3], S32); // Row/col to stop at 1310 ps MaskType maskVal = PS_SCALAR_VALUE(args->data[4], U8); // Value to mask/set1310 psImageMaskType maskVal = PS_SCALAR_VALUE(args->data[4], PS_TYPE_IMAGE_MASK_DATA); // Value to mask/set 1311 1311 int kernelMin = PS_SCALAR_VALUE(args->data[5], S32); // Minimum range for kernel 1312 1312 int kernelMax = PS_SCALAR_VALUE(args->data[6], S32); // Maximum range for kernel … … 1317 1317 } 1318 1318 1319 psImage *psImageConvolveMask(psImage *out, const psImage *mask, ps MaskType maskVal,1320 ps MaskType setVal, int xMin, int xMax, int yMin, int yMax)1319 psImage *psImageConvolveMask(psImage *out, const psImage *mask, psImageMaskType maskVal, 1320 psImageMaskType setVal, int xMin, int xMax, int yMin, int yMax) 1321 1321 { 1322 1322 PS_ASSERT_IMAGE_NON_NULL(mask, NULL); 1323 PS_ASSERT_IMAGE_TYPE(mask, PS_TYPE_ MASK, NULL);1323 PS_ASSERT_IMAGE_TYPE(mask, PS_TYPE_IMAGE_MASK, NULL); 1324 1324 if (out) { 1325 1325 PS_ASSERT_IMAGE_NON_NULL(out, NULL); 1326 PS_ASSERT_IMAGE_TYPE(out, PS_TYPE_ MASK, NULL);1326 PS_ASSERT_IMAGE_TYPE(out, PS_TYPE_IMAGE_MASK, NULL); 1327 1327 PS_ASSERT_IMAGES_SIZE_EQUAL(out, mask, NULL); 1328 1328 if (out == mask && ((maskVal & setVal) || !setVal)) { … … 1354 1354 1355 1355 // Propagate the non-masked values 1356 out = (psImage*)psBinaryOp(out, (const psPtr)mask, "&", psScalarAlloc(~setVal, PS_TYPE_ MASK));1356 out = (psImage*)psBinaryOp(out, (const psPtr)mask, "&", psScalarAlloc(~setVal, PS_TYPE_IMAGE_MASK)); 1357 1357 1358 1358 if (!setVal) { … … 1360 1360 } 1361 1361 1362 psImage *conv = psImageAlloc(numCols, numRows, PS_TYPE_ MASK); // Temporary convolved image1362 psImage *conv = psImageAlloc(numCols, numRows, PS_TYPE_IMAGE_MASK); // Temporary convolved image 1363 1363 psImageInit(conv, 0); 1364 1364 … … 1377 1377 PS_ARRAY_ADD_SCALAR(job->args, start, PS_TYPE_S32); 1378 1378 PS_ARRAY_ADD_SCALAR(job->args, stop, PS_TYPE_S32); 1379 PS_ARRAY_ADD_SCALAR(job->args, maskVal, PS_TYPE_ MASK);1379 PS_ARRAY_ADD_SCALAR(job->args, maskVal, PS_TYPE_IMAGE_MASK); 1380 1380 PS_ARRAY_ADD_SCALAR(job->args, xMin, PS_TYPE_S32); 1381 1381 PS_ARRAY_ADD_SCALAR(job->args, xMax, PS_TYPE_S32); … … 1415 1415 PS_ARRAY_ADD_SCALAR(job->args, start, PS_TYPE_S32); 1416 1416 PS_ARRAY_ADD_SCALAR(job->args, stop, PS_TYPE_S32); 1417 PS_ARRAY_ADD_SCALAR(job->args, setVal, PS_TYPE_ MASK);1417 PS_ARRAY_ADD_SCALAR(job->args, setVal, PS_TYPE_IMAGE_MASK); 1418 1418 PS_ARRAY_ADD_SCALAR(job->args, yMin, PS_TYPE_S32); 1419 1419 PS_ARRAY_ADD_SCALAR(job->args, yMax, PS_TYPE_S32); … … 1460 1460 min = PS_MAX(0, min); 1461 1461 max = PS_MIN(numCols - 1, max); 1462 memset(&convData[y][min], 0xff, (max - min + 1) * PSELEMTYPE_SIZEOF(PS_TYPE_ MASK));1462 memset(&convData[y][min], 0xff, (max - min + 1) * PSELEMTYPE_SIZEOF(PS_TYPE_IMAGE_MASK)); 1463 1463 } 1464 1464 } … … 1466 1466 // Mask from the minimum to the end of the row 1467 1467 min = PS_MAX(0, min); 1468 memset(&convData[y][min], 0xff, (numCols - min) * PSELEMTYPE_SIZEOF(PS_TYPE_ MASK));1468 memset(&convData[y][min], 0xff, (numCols - min) * PSELEMTYPE_SIZEOF(PS_TYPE_IMAGE_MASK)); 1469 1469 } 1470 1470 }
Note:
See TracChangeset
for help on using the changeset viewer.
