Changeset 14752 for trunk/psModules/src/imcombine/pmSubtraction.c
- Timestamp:
- Sep 5, 2007, 11:17:59 AM (19 years ago)
- File:
-
- 1 edited
-
trunk/psModules/src/imcombine/pmSubtraction.c (modified) (13 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules/src/imcombine/pmSubtraction.c
r14739 r14752 4 4 * @author GLG, MHPCC 5 5 * 6 * @version $Revision: 1.5 6$ $Name: not supported by cvs2svn $7 * @date $Date: 2007-09-05 00:15:28$6 * @version $Revision: 1.57 $ $Name: not supported by cvs2svn $ 7 * @date $Date: 2007-09-05 21:17:59 $ 8 8 * 9 9 * Copyright 2004-2007 Institute for Astronomy, University of Hawaii … … 75 75 } 76 76 77 // Apply the appropriate weighting to the kernel value 78 static inline float kernelWeighting(float value, // Value to apply weighting 79 bool variance // Do variance weighting? 80 ) 81 { 82 return variance ? PS_SQR(value) : value; 83 } 84 77 // Generate the kernel to apply to the variance from the normal kernel 78 static psKernel *varianceKernel(psKernel *normalKernel // Normal kernel 79 ) 80 { 81 psKernel *kernel = psKernelAlloc(normalKernel->xMin, normalKernel->xMax, 82 normalKernel->yMin, normalKernel->yMax); // Kernel to return 83 84 // Take the square of the normal kernel 85 for (int v = -size; v <= size; v++) { 86 for (int u = -size; u <= size; u++) { 87 kernel->kernel[v][u] = PS_SQR(normalKernel->kernel[v][u]); 88 } 89 } 90 91 return kernel; 92 } 85 93 86 94 // Generate an image of the solved kernel … … 88 96 const psVector *solution, // Solution to the least-squares problem 89 97 const pmSubtractionKernels *kernels, // Kernel basis functions 90 const psImage *polyValues, // Spatial polynomial values 91 bool varianceWeighting // Do variance weighting? 98 const psImage *polyValues // Spatial polynomial values 92 99 ) 93 100 { … … 113 120 114 121 for (int i = 0; i < numKernels; i++) { 115 double sum = 0.0; // Sum of multiple polynomial terms122 double value = 0.0; // Value of this component, from the sum of multiple polynomial terms 116 123 for (int yOrder = 0, index = i; yOrder <= spatialOrder; yOrder++) { 117 124 for (int xOrder = 0; xOrder <= spatialOrder - yOrder; xOrder++, index += numKernels) { 118 sum += polyValues->data.F64[yOrder][xOrder] * solution->data.F64[index]; 119 } 120 } 121 float value = kernelWeighting(sum, varianceWeighting); // Value to be added to kernel 122 float subValue = kernelWeighting(- sum, varianceWeighting); // Value to be added for subtraction 125 value += polyValues->data.F64[yOrder][xOrder] * solution->data.F64[index]; 126 } 127 } 123 128 124 129 switch (kernels->type) { … … 129 134 if (kernels->spatialOrder > 0 && i != kernels->subIndex) { 130 135 // The (0,0) element is subtracted from most kernels to preserve photometric scaling 131 kernel->kernel[0][0] += subValue;136 kernel->kernel[0][0] -= value; 132 137 } 133 138 break; … … 142 147 143 148 // Normalising sum of kernel component to unity 144 float norm = kernelWeighting(1.0 / (float)((uStop - uStart + 1) * (vStop - vStart + 1)), 145 varianceWeighting); 149 float norm = 1.0 / (float)((uStop - uStart + 1) * (vStop - vStart + 1)); 146 150 147 151 for (int v = vStart; v <= vStop; v++) { … … 150 154 if (kernels->spatialOrder > 0 && i != kernels->subIndex) { 151 155 // The (0,0) element is subtracted from most kernels to preserve photometric scaling 152 kernel->kernel[0][0] += subValue;156 kernel->kernel[0][0] -= value; 153 157 } 154 158 } … … 163 167 for (int v = -size; v <= size; v++) { 164 168 for (int u = -size; u <= size; u++) { 165 kernel->kernel[v][u] += kernelWeighting(preCalc->kernel[v][u], 166 varianceWeighting) * value; 169 kernel->kernel[v][u] += preCalc->kernel[v][u] * value; 167 170 // Photometric scaling is built into the preCalc kernel --- no subtraction! 168 171 } … … 176 179 if (subtract) { 177 180 // The (0,0) element is subtracted from most kernels to preserve photometric scaling 178 kernel->kernel[0][0] += subValue;181 kernel->kernel[0][0] -= value; 179 182 } 180 183 } … … 186 189 for (int v = -size; v <= size; v++) { 187 190 for (int u = -size; u <= size; u++) { 188 kernel->kernel[v][u] += kernelWeighting(preCalc->kernel[v][u], 189 varianceWeighting) * value; 191 kernel->kernel[v][u] += preCalc->kernel[v][u] * value; 190 192 // Photometric scaling is built into the preCalc kernel --- no subtraction! 191 193 } … … 206 208 for (int j = 0; j < num; j++) { 207 209 int u = uCoords->data.S32[j], v = vCoords->data.S32[j]; // Kernel coordinates 208 kernel->kernel[v][u] += kernelWeighting(poly->data.F32[j], varianceWeighting)* value;210 kernel->kernel[v][u] += poly->data.F32[j] * value; 209 211 } 210 212 // Photometric scaling is built into the kernel --- no subtraction! … … 939 941 940 942 // The appropriate kernel 941 psKernel *kernel = solvedKernel(NULL, solution, kernels, polyValues , false);943 psKernel *kernel = solvedKernel(NULL, solution, kernels, polyValues); 942 944 943 945 psFree(polyValues); … … 1091 1093 2.0 * (float)(j + size + 1 - numRows/2.0) / (float)numRows); 1092 1094 1093 kernelImage = solvedKernel(kernelImage, solution, kernels, polyValues , false);1095 kernelImage = solvedKernel(kernelImage, solution, kernels, polyValues); 1094 1096 if (inWeight) { 1095 kernelWeight = solvedKernel(kernelWeight, solution, kernels, polyValues, true);1097 kernelWeight = varianceKernel(kernelImage); 1096 1098 } 1097 1099
Note:
See TracChangeset
for help on using the changeset viewer.
