Changeset 16607
- Timestamp:
- Feb 22, 2008, 9:50:56 AM (18 years ago)
- Location:
- trunk/psModules/src/imcombine
- Files:
-
- 11 edited
-
pmPSFEnvelope.c (modified) (2 diffs)
-
pmStack.c (modified) (2 diffs)
-
pmStackReject.c (modified) (5 diffs)
-
pmStackReject.h (modified) (1 diff)
-
pmSubtraction.c (modified) (5 diffs)
-
pmSubtraction.h (modified) (1 diff)
-
pmSubtractionEquation.c (modified) (1 diff)
-
pmSubtractionKernels.c (modified) (1 diff)
-
pmSubtractionKernels.h (modified) (1 diff)
-
pmSubtractionMatch.c (modified) (2 diffs)
-
pmSubtractionMatch.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules/src/imcombine/pmPSFEnvelope.c
r16479 r16607 31 31 32 32 33 #define TESTING // Enable test output33 //#define TESTING // Enable test output 34 34 #define PEAK_FLUX 1.0e3 // Peak flux for each source 35 35 #define SKY_VALUE 0.0e0 // Sky value for fake image … … 94 94 fake->peak = pmPeakAlloc(xFake - dx, yFake - dy, PEAK_FLUX, PM_PEAK_LONE); 95 95 fake->type = PM_SOURCE_TYPE_STAR; 96 97 #ifdef TESTING98 // Required to generate model image99 96 fake->psfMag = -2.5 * log10(PEAK_FLUX); 100 #endif101 97 102 98 psTrace("psModules.imcombine", 5, "Source %d: %.2f,%.2f\n", -
trunk/psModules/src/imcombine/pmStack.c
r16604 r16607 8 8 * @author GLG, MHPCC 9 9 * 10 * @version $Revision: 1.19 $ $Name: not supported by cvs2svn $ 11 * @date $Date: 2008-02-22 19:50:56 $ 10 12 * Copyright 2004-2007 Institute for Astronomy, University of Hawaii 11 13 * … … 510 512 for (int j = 0; j < pixels->n; j++) { 511 513 int x = pixels->data[j].x, y = pixels->data[j].y; // Coordinates of interest 514 if (x < 0 || x >= numCols || y < 0 || y >= numRows) { 515 psWarning("Bad pixel coordinate: %d,%d --- ignored.", x, y); 516 continue; 517 } 512 518 psArray *columns = map->data[y]; // The columns for that row 513 519 psVector *images = columns->data[x]; // The images for that column -
trunk/psModules/src/imcombine/pmStackReject.c
r16604 r16607 11 11 #define PIXEL_LIST_BUFFER 100 // Number of pixels to add to list at a time 12 12 13 psPixels *pmStackReject(const psPixels *in, float threshold, const psArray *regions,14 const psArray *s olutions, const pmSubtractionKernels*kernels)13 psPixels *pmStackReject(const psPixels *in, const psRegion *valid, float threshold, 14 const psArray *subRegions, const psArray *kernels) 15 15 { 16 16 PS_ASSERT_PIXELS_NON_NULL(in, NULL); 17 17 PS_ASSERT_FLOAT_LARGER_THAN_OR_EQUAL(threshold, 0.0, NULL); 18 18 PS_ASSERT_FLOAT_LESS_THAN_OR_EQUAL(threshold, 1.0, NULL); 19 PS_ASSERT_ARRAY_NON_NULL(regions, NULL); 20 PS_ASSERT_ARRAY_NON_NULL(solutions, NULL); 21 PS_ASSERT_ARRAYS_SIZE_EQUAL(regions, solutions, NULL); 22 PS_ASSERT_PTR_NON_NULL(kernels, NULL); 19 PS_ASSERT_ARRAY_NON_NULL(subRegions, NULL); 20 PS_ASSERT_ARRAY_NON_NULL(kernels, NULL); 21 PS_ASSERT_ARRAYS_SIZE_EQUAL(subRegions, kernels, NULL); 23 22 24 23 // Get the original image size 25 int numRegions = regions->n; // Number of regions24 int numRegions = subRegions->n; // Number of regions 26 25 int numCols = 0, numRows = 0; // Size of original image 27 26 int minCols = INT_MAX, minRows = INT_MAX; // Minimum coordinate for image 28 27 int size = 0; // Size of kernel 29 28 for (int i = 0; i < numRegions; i++) { 30 psRegion * region = regions->data[i]; // Region of interest31 if ( region->x0 < minCols) {32 minCols = region->x0;29 psRegion *subRegion = subRegions->data[i]; // Region of interest 30 if (subRegion->x0 < minCols) { 31 minCols = subRegion->x0; 33 32 } 34 if ( region->y0 < minRows) {35 minRows = region->y0;33 if (subRegion->y0 < minRows) { 34 minRows = subRegion->y0; 36 35 } 37 if ( region->x1 > numCols) {38 numCols = region->x1;36 if (subRegion->x1 > numCols) { 37 numCols = subRegion->x1; 39 38 } 40 if (region->y1 > numRows) { 41 numRows = region->y1; 39 if (subRegion->y1 > numRows) { 40 numRows = subRegion->y1; 41 } 42 43 pmSubtractionKernels *kernel = kernels->data[i]; // Kernel of interest 44 if (size == 0) { 45 size = kernel->size; 46 } else if (kernel->size != size) { 47 psError(PS_ERR_BAD_PARAMETER_VALUE, true, "Kernel sizes are not identical: %d vs %d", 48 size, kernel->size); 49 return NULL; 42 50 } 43 51 } 44 if (minCols != 0 || minRows != 0) { 45 psError(PS_ERR_BAD_PARAMETER_VALUE, true, 46 "Some error with image regions --- minimum coordinate is not 0,0"); 47 return NULL; 52 53 // Adjust the size for the size of the subimage 54 if (valid) { 55 minCols = PS_MAX(valid->x0, minCols); 56 minRows = PS_MAX(valid->y0, minRows); 57 numCols = PS_MIN(valid->x1, numCols); 58 numRows = PS_MIN(valid->y1, numRows); 48 59 } 49 60 psTrace("psModules.imcombine", 1, "Rejecting [%d:%d,%d:%d]\n", minCols, numCols, minRows, numRows); 50 61 51 psImage *mask = psPixelsToMask(NULL, in, psRegionSet(0, numCols, 0, numRows), 0x01); // Mask image 62 psImage *mask = psPixelsToMask(NULL, in, psRegionSet(minCols, numCols - 1, minRows, numRows - 1), 63 0x01); // Mask 52 64 psImage *image = psImageCopy(NULL, mask, PS_TYPE_F32); // Floating-point version, so we can convolve 53 65 psFree(mask); … … 57 69 pmReadout *inRO = pmReadoutAlloc(NULL); // Readout with input image 58 70 inRO->image = image; 71 inRO->col0 = minCols; 72 inRO->row0 = minRows; 59 73 for (int i = 0; i < numRegions; i++) { 60 74 psRegion *region = subRegions->data[i]; // Region of interest … … 76 90 77 91 // Image of the kernel at the centre of the region 78 float xNorm = (region->x0 + 0.5 * (region->x1 - region->x0) - numCols/2.0) / (float)numCols; 79 float yNorm = (region->y0 + 0.5 * (region->y1 - region->y0) - numRows/2.0) / (float)numRows; 80 psImage *kernel = pmSubtractionKernelImage(kernels, xNorm, yNorm, false); 81 if (!kernel) { 92 float xNorm = (region->x0 + 0.5 * (region->x1 - region->x0) - kernel->numCols/2.0) / 93 (float)kernel->numCols; 94 float yNorm = (region->y0 + 0.5 * (region->y1 - region->y0) - kernel->numRows/2.0) / 95 (float)kernel->numRows; 96 psImage *image = pmSubtractionKernelImage(kernel, xNorm, yNorm, false); 97 if (!image) { 82 98 psError(PS_ERR_UNKNOWN, false, "Unable to generate kernel image."); 83 99 psFree(convRO); … … 86 102 } 87 103 float sum = 0.0; 88 for (int y = 0; y < kernel->numRows; y++) {89 for (int x = 0; x < kernel->numCols; x++) {90 sum += kernel->data.F32[y][x];104 for (int y = 0; y < image->numRows; y++) { 105 for (int x = 0; x < image->numCols; x++) { 106 sum += image->data.F32[y][x]; 91 107 } 92 108 } 93 psFree( kernel);109 psFree(image); 94 110 95 psImage *subConv = psImageSubset(convRO->image, *region); // Sub-image of convolved image 96 psBinaryOp(subConv, subConv, "*", psScalarAlloc(1.0 / sum, PS_TYPE_F32)); 111 // Range for normalisation 112 int yMin = PS_MAX(minRows, region->y0) - inRO->row0; 113 int yMax = PS_MIN(numRows - 1, region->y1) - inRO->row0; 114 int xMin = PS_MAX(minCols, region->x0) - inRO->col0; 115 int xMax = PS_MIN(numCols - 1, region->x1) - inRO->col0; 116 psTrace("psModules.imcombine", 2, "Normalising convolved mask image by %f over %d:%d,%d:%d\n", 117 sum, xMin, xMax, yMin, yMax); 118 for (int y = yMin; y <= yMax; y++) { 119 for (int x = xMin; x <= xMax; x++) { 120 convRO->image->data.F32[y][x] /= sum; 121 } 122 } 97 123 } 98 124 psFree(inRO); … … 124 150 for (int y = yMin; y <= yMax; y++) { 125 151 for (int x = xMin; x <= xMax; x++) { 152 assert(x < mask->numCols && y < mask->numRows); 126 153 mask->data.PS_TYPE_MASK_DATA[y][x] = 0xff; 127 154 } -
trunk/psModules/src/imcombine/pmStackReject.h
r16479 r16607 10 10 /// We apply a matched filter to the corresponding mask image, and threshold to find the original pixels 11 11 psPixels *pmStackReject(const psPixels *in, ///< List of pixels in the convolved image 12 const psRegion *valid, ///< Valid region to consider 12 13 float threshold, ///< Threshold on convolved image, 0..1 13 14 const psArray *regions, ///< Array of image regions for image 14 const psArray *solutions, ///< Array of solution vectors for image 15 const pmSubtractionKernels *kernels ///< Kernel parameters 15 const psArray *kernels ///< Array of kernel parameters for each region 16 16 ); 17 17 -
trunk/psModules/src/imcombine/pmSubtraction.c
r16604 r16607 4 4 * @author GLG, MHPCC 5 5 * 6 * @version $Revision: 1.82 $ $Name: not supported by cvs2svn $ 7 * @date $Date: 2008-02-22 19:50:56 $ 8 * 6 9 * Copyright 2004-2007 Institute for Astronomy, University of Hawaii 7 10 * … … 47 50 48 51 // Take the square of the normal kernel 49 double sumNormal = 0.0, sumVariance = 0.0; // Sum of the normal and variance kernels50 52 for (int v = yMin; v <= yMax; v++) { 51 53 for (int u = xMin; u <= xMax; u++) { 52 float value = normalKernel->kernel[v][u]; // Value of interest 53 float value2 = PS_SQR(value); // Value squared 54 sumNormal += value; 55 sumVariance += value2; 56 out->kernel[v][u] = value2; 57 } 58 } 59 60 // Normalise so that the sum of the variance kernel is the square of the sum of the normal kernel 61 // This is required to keep the relative scaling between the image and the weight map 62 psBinaryOp(out->image, out->image, "*", psScalarAlloc(PS_SQR(sumNormal) / sumVariance, PS_TYPE_F32)); 54 out->kernel[v][u] = PS_SQR(normalKernel->kernel[v][u]); 55 } 56 } 63 57 64 58 return out; … … 687 681 PS_ASSERT_IMAGE_TYPE(out1->weight, PS_TYPE_F32, false); 688 682 } 689 if (region) { 690 if (psRegionIsNaN(*region)) { 691 psString string = psRegionToString(*region); 692 psError(PS_ERR_BAD_PARAMETER_VALUE, true, "Input region (%s) contains NAN values", string); 693 psFree(string); 694 return false; 695 } 696 if (region->x0 < 0 || region->x1 > ro1->image->numCols || 697 region->y0 < 0 || region->y1 > ro1->image->numRows) { 698 psString string = psRegionToString(*region); 699 psError(PS_ERR_BAD_PARAMETER_VALUE, true, "Input region (%s) does not fit in image (%dx%d)", 700 string, ro1->image->numCols, ro1->image->numRows); 701 psFree(string); 702 return false; 703 } 683 if (region && psRegionIsNaN(*region)) { 684 psString string = psRegionToString(*region); 685 psError(PS_ERR_BAD_PARAMETER_VALUE, true, "Input region (%s) contains NAN values", string); 686 psFree(string); 687 return false; 704 688 } 705 689 … … 776 760 yMax = PS_MIN(region->y1, yMax); 777 761 } 762 763 // Size to use when calculating normalised coordinates (different from actual size when convolving 764 // subimage) 765 int xNormSize = (kernels->numCols > 0 ? kernels->numCols : numCols); 766 int yNormSize = (kernels->numRows > 0 ? kernels->numRows : numRows); 778 767 779 768 psMaskType maskSource; // Mask these pixels when convolving … … 803 792 for (int j = yMin; j < yMax; j += fullSize) { 804 793 int ySubMax = PS_MIN(j + fullSize, yMax); // Range for subregion of interest 805 float yNorm = 2.0 * (float)(j + size + 1 - numRows/2.0) / (float)numRows; // Normalised coordinate 794 float yNorm = 2.0 * (float)(j + y0 + size + 1 - yNormSize/2.0) / 795 (float)yNormSize; // Normalised coordinate 806 796 for (int i = xMin; i < xMax; i += fullSize) { 807 797 int xSubMax = PS_MIN(i + fullSize, xMax); // Range for subregion of interest 808 float xNorm = 2.0 * (float)(i + size + 1 - numCols/2.0) / (float)numCols; // Normalised coordinate 798 float xNorm = 2.0 * (float)(i + x0 + size + 1 - xNormSize/2.0) / 799 (float)xNormSize; // Normalised coordinate 809 800 810 801 // Only generate polynomial values every kernel footprint, since we have already assumed -
trunk/psModules/src/imcombine/pmSubtraction.h
r16604 r16607 6 6 * @author GLG, MHPCC 7 7 * 8 * @version $Revision: 1.2 3$ $Name: not supported by cvs2svn $9 * @date $Date: 2008-02-22 19: 24:42$8 * @version $Revision: 1.24 $ $Name: not supported by cvs2svn $ 9 * @date $Date: 2008-02-22 19:50:56 $ 10 10 * Copyright 2004-207 Institute for Astronomy, University of Hawaii 11 11 */ -
trunk/psModules/src/imcombine/pmSubtractionEquation.c
r16479 r16607 14 14 15 15 16 #define TESTING16 //#define TESTING 17 17 18 18 ////////////////////////////////////////////////////////////////////////////////////////////////////////////// -
trunk/psModules/src/imcombine/pmSubtractionKernels.c
r16479 r16607 180 180 kernels->bgOrder = 0; 181 181 kernels->mode = mode; 182 kernels->numCols = 0; 183 kernels->numRows = 0; 182 184 kernels->solution1 = NULL; 183 185 kernels->solution2 = NULL; -
trunk/psModules/src/imcombine/pmSubtractionKernels.h
r16479 r16607 39 39 int bgOrder; ///< The order for the background fitting 40 40 pmSubtractionMode mode; ///< Mode for subtraction 41 int numCols, numRows; ///< Size of image (for normalisation), or zero to use image provided 41 42 psVector *solution1, *solution2; ///< Solution for the PSF matching 42 43 } pmSubtractionKernels; -
trunk/psModules/src/imcombine/pmSubtractionMatch.c
r16604 r16607 306 306 inner, binning, ringsOrder, mode); 307 307 } 308 psMetadataAddPtr(conv1->analysis, PS_LIST_TAIL, "SUBTRACTION.KERNEL", 309 PS_DATA_UNKNOWN | PS_META_DUPLICATE_OK, "Subtraction kernels", kernels); 308 309 // Add analysis metadata 310 { 311 psMetadataAddPtr(conv1->analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_KERNEL, 312 PS_DATA_UNKNOWN | PS_META_DUPLICATE_OK, "Subtraction kernels", kernels); 313 if (conv2) { 314 psMetadataAddPtr(conv2->analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_KERNEL, 315 PS_DATA_UNKNOWN | PS_META_DUPLICATE_OK, "Subtraction kernels", kernels); 316 } 317 psMetadataAddS32(conv1->analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_MODE, 318 PS_META_DUPLICATE_OK, "Subtraction kernels", mode); 319 if (conv2) { 320 psMetadataAddS32(conv2->analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_MODE, 321 PS_META_DUPLICATE_OK, "Subtraction kernels", mode); 322 } 323 psRegion *subRegion; 324 if (region) { 325 subRegion = psMemIncrRefCounter(region); 326 } else { 327 subRegion = psRegionAlloc(0, numCols, 0, numRows); 328 } 329 psMetadataAddPtr(conv1->analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_REGION, 330 PS_DATA_REGION | PS_META_DUPLICATE_OK, 331 "Region over which subtraction was performed", subRegion); 332 if (conv2) { 333 psMetadataAddPtr(conv2->analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_REGION, 334 PS_DATA_REGION | PS_META_DUPLICATE_OK, 335 "Region over which subtraction was performed", subRegion); 336 } 337 psFree(subRegion); 338 } 310 339 311 340 memCheck("kernels"); … … 442 471 kernels = NULL; 443 472 444 #if 0445 // Put the solution on the metadata446 {447 psString comment = NULL; // Comment for metadata448 psStringAppend(&comment, "Subtraction solution for region %s", regionString);449 psMetadataAddVector(conv1->analysis, PS_LIST_TAIL, "SUBTRACTION.SOLUTION",450 PS_META_DUPLICATE_OK, comment, solution);451 psFree(comment);452 if (region) {453 psMetadataAddPtr(conv1->analysis, PS_LIST_TAIL, "SUBTRACTION.REGION",454 PS_META_DUPLICATE_OK | PS_DATA_REGION, comment, region);455 } else {456 region = psRegionAlloc(0, numCols, 0, numRows);457 psMetadataAddPtr(conv1->analysis, PS_LIST_TAIL, "SUBTRACTION.REGION",458 PS_META_DUPLICATE_OK | PS_DATA_REGION, comment, region);459 psFree(region);460 region = NULL;461 }462 }463 #endif464 465 473 // There is data in the readout now 466 474 conv1->data_exists = true; -
trunk/psModules/src/imcombine/pmSubtractionMatch.h
r16479 r16607 8 8 #include <pmSubtractionKernels.h> 9 9 #include <pmSubtractionStamps.h> 10 11 #define PM_SUBTRACTION_ANALYSIS_KERNEL "SUBTRACTION.KERNEL" // Name of kernel in the analysis metadata 12 #define PM_SUBTRACTION_ANALYSIS_MODE "SUBTRACTION.MODE" // Name of subtraction mode in the analysis metadata 13 #define PM_SUBTRACTION_ANALYSIS_REGION "SUBTRACTION.REGION" // Name of subtraction region in the analysis MD 14 10 15 11 16 /// Match two images
Note:
See TracChangeset
for help on using the changeset viewer.
