Changeset 35726
- Timestamp:
- Jun 28, 2013, 4:24:43 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules/src/imcombine/pmSubtractionSimple.c
r35717 r35726 30 30 const pmReadout *ro2, 31 31 const psArray *sources, 32 int size 32 int size, 33 psImageMaskType maskVal, 34 psImageMaskType maskBad, 35 psImageMaskType maskPoor 33 36 ) { 34 37 // … … 38 41 float sigma1,sigma2,sigmaKern; 39 42 int convolution_direction = 0; 43 psImage *image1; 44 psImage *mask1; 45 psImage *var1; 46 47 psImage *image2; 48 psImage *mask2; 49 psImage *var2; 50 51 psImage *imageC1; 52 psImage *maskC1; 53 psImage *varC1; 54 55 psImage *imageC2; 56 psImage *maskC2; 57 psImage *varC2; 40 58 41 59 // Allocate images, as this is usually done by subtractionMatchAlloc after this function is called. 42 psImageMaskType maskBad = 1;43 60 int numCols = ro1->image->numCols; 44 61 int numRows = ro1->image->numRows; 45 46 if (!conv1->image) { 47 conv1->image = psImageAlloc(numCols, numRows, PS_TYPE_F32); 48 } 49 psImageInit(conv1->image, NAN); 50 if (ro1->variance) { 51 if (!conv1->variance) { 52 conv1->variance = psImageAlloc(numCols, numRows, PS_TYPE_F32); 53 } 54 psImageInit(conv1->variance, NAN); 55 } 56 if (!conv1->mask) { 57 conv1->mask = psImageAlloc(numCols, numRows, PS_TYPE_IMAGE_MASK); 58 } 59 psImageInit(conv1->mask, maskBad); 60 if (!conv2->image) { 61 conv2->image = psImageAlloc(numCols, numRows, PS_TYPE_F32); 62 } 63 psImageInit(conv2->image, NAN); 64 if (ro2->variance) { 65 if (!conv2->variance) { 66 conv2->variance = psImageAlloc(numCols, numRows, PS_TYPE_F32); 67 } 68 psImageInit(conv2->variance, NAN); 69 } 70 if (!conv2->mask) { 71 conv2->mask = psImageAlloc(numCols, numRows, PS_TYPE_IMAGE_MASK); 72 } 73 psImageInit(conv2->mask, maskBad); 74 75 76 77 78 psImage *image1 = ro1->image; 79 psImage *mask1 = ro1->mask; 80 psImage *var1 = ro1->variance; 81 82 psImage *image2 = ro2->image; 83 psImage *mask2 = ro2->mask; 84 psImage *var2 = ro2->variance; 85 86 psImage *imageC1 = conv1->image; 87 psImage *maskC1 = conv1->mask; 88 psImage *varC1 = conv1->variance; 89 90 psImage *imageC2 = conv2->image; 91 psImage *maskC2 = conv2->mask; 92 psImage *varC2 = conv2->variance; 93 62 63 if (conv1) { 64 if (!conv1->image) { 65 conv1->image = psImageAlloc(numCols, numRows, PS_TYPE_F32); 66 } 67 psImageInit(conv1->image, NAN); 68 if (ro1->variance) { 69 if (!conv1->variance) { 70 conv1->variance = psImageAlloc(numCols, numRows, PS_TYPE_F32); 71 } 72 psImageInit(conv1->variance, NAN); 73 } 74 if (!conv1->mask) { 75 conv1->mask = psImageAlloc(numCols, numRows, PS_TYPE_IMAGE_MASK); 76 } 77 psImageInit(conv1->mask, maskBad); 78 } 79 if (conv2) { 80 if (!conv2->image) { 81 conv2->image = psImageAlloc(numCols, numRows, PS_TYPE_F32); 82 } 83 psImageInit(conv2->image, NAN); 84 if (ro2->variance) { 85 if (!conv2->variance) { 86 conv2->variance = psImageAlloc(numCols, numRows, PS_TYPE_F32); 87 } 88 psImageInit(conv2->variance, NAN); 89 } 90 if (!conv2->mask) { 91 conv2->mask = psImageAlloc(numCols, numRows, PS_TYPE_IMAGE_MASK); 92 } 93 psImageInit(conv2->mask, maskBad); 94 } 95 96 // Assign local aliases to images 97 image1 = ro1->image; 98 mask1 = ro1->mask; 99 var1 = ro1->variance; 100 101 image2 = ro2->image; 102 mask2 = ro2->mask; 103 var2 = ro2->variance; 104 105 if (conv1) { 106 imageC1 = conv1->image; 107 maskC1 = conv1->mask; 108 varC1 = conv1->variance; 109 } 110 111 if (conv2) { 112 imageC2 = conv2->image; 113 maskC2 = conv2->mask; 114 varC2 = conv2->variance; 115 } 116 94 117 // 95 118 // Determine Gaussian widths … … 105 128 sigmaKern = sqrt(PS_SQR(sigma2) - PS_SQR(sigma1)); 106 129 } 130 if (!conv1) { 131 convolution_direction = 2; 132 } 133 if (!conv2) { 134 convolution_direction = 1; 135 } 107 136 108 137 // … … 110 139 psVector *kernelVec = pmSubtractionKernelSIMPLE(sigmaKern,0,size); // This is normalized to unity. 111 140 112 float normalization = 1.0;113 114 for (int i = 0; i < 2 * size + 1; i++) {115 kernelVec->data.F32[i] *= sqrt(normalization); // Needs to be this because we apply this vector twice.116 }117 141 118 142 // 119 143 // Do convolutions 120 144 psImage *temp = psImageAlloc(numCols,numRows,PS_TYPE_F32); 121 for (int y = 0; y < image1->numRows; y++) { 122 for (int x = 0; x < image1->numCols; x++) { 123 145 psImage *tempMask = psImageAlloc(numCols,numRows,PS_TYPE_IMAGE_MASK); 146 psImage *tempVar = psImageAlloc(numCols,numRows,PS_TYPE_F32); 147 148 for (int y = 0; y < numRows; y++) { 149 for (int x = 0; x < numCols; x++) { 124 150 temp->data.F32[y][x] = 0.0; 125 151 tempVar->data.F32[y][x] = 0.0; 152 tempMask->data.PS_TYPE_IMAGE_MASK_DATA[y][x] = 0; 153 154 // Copy the image we're not convolving into the convolved output 126 155 if (convolution_direction == 1) { 127 imageC1->data.F32[y][x] = 0.0; 128 maskC1->data.PS_TYPE_IMAGE_MASK_DATA[y][x] = 0; 129 varC1->data.F32[y][x] = 0.0; 130 131 imageC2->data.F32[y][x] = image2->data.F32[y][x]; 132 maskC2->data.PS_TYPE_IMAGE_MASK_DATA[y][x] = mask2->data.PS_TYPE_IMAGE_MASK_DATA[y][x]; 133 varC2->data.F32[y][x] = var2->data.F32[y][x]; 156 if (conv1) { 157 imageC1->data.F32[y][x] = 0.0; 158 maskC1->data.PS_TYPE_IMAGE_MASK_DATA[y][x] = 0; 159 varC1->data.F32[y][x] = 0.0; 160 } 161 if (conv2) { 162 imageC2->data.F32[y][x] = image2->data.F32[y][x]; 163 maskC2->data.PS_TYPE_IMAGE_MASK_DATA[y][x] = mask2->data.PS_TYPE_IMAGE_MASK_DATA[y][x]; 164 varC2->data.F32[y][x] = var2->data.F32[y][x]; 165 } 134 166 } 135 167 else if (convolution_direction == 2) { 136 imageC2->data.F32[y][x] = 0.0; 137 maskC2->data.PS_TYPE_IMAGE_MASK_DATA[y][x] = 0; 138 varC2->data.F32[y][x] = 0.0; 139 140 imageC1->data.F32[y][x] = image1->data.F32[y][x]; 141 maskC1->data.PS_TYPE_IMAGE_MASK_DATA[y][x] = mask1->data.PS_TYPE_IMAGE_MASK_DATA[y][x]; 142 varC1->data.F32[y][x] = var1->data.F32[y][x]; 143 } 168 if (conv2) { 169 imageC2->data.F32[y][x] = 0.0; 170 maskC2->data.PS_TYPE_IMAGE_MASK_DATA[y][x] = 0; 171 varC2->data.F32[y][x] = 0.0; 172 } 173 if (conv1) { 174 imageC1->data.F32[y][x] = image1->data.F32[y][x]; 175 maskC1->data.PS_TYPE_IMAGE_MASK_DATA[y][x] = mask1->data.PS_TYPE_IMAGE_MASK_DATA[y][x]; 176 varC1->data.F32[y][x] = var1->data.F32[y][x]; 177 } 178 } 179 180 // Do y-direction convolution 144 181 for (int v = -size; v <= size; v++) { 145 182 if ((y-v >= 0)&&(y-v < numRows)) { 146 183 if (convolution_direction == 1) { 184 // Insert mask/finite check here. 147 185 temp->data.F32[y][x] += kernelVec->data.F32[v + size] * image1->data.F32[y - v][x]; 186 tempVar->data.F32[y][x] += kernelVec->data.F32[v + size] * var1->data.F32[y - v][x]; 148 187 } 149 188 else if (convolution_direction == 2) { 189 // And here. 150 190 temp->data.F32[y][x] += kernelVec->data.F32[v + size] * image2->data.F32[y - v][x]; 191 tempVar->data.F32[y][x] += kernelVec->data.F32[v + size] * var2->data.F32[y - v][x]; 151 192 } 152 193 } … … 154 195 } 155 196 } 156 for (int y = 0; y < image1->numRows; y++) { 157 for (int x = 0; x < image1->numCols; x++) { 197 198 // Do x-direction convolution 199 for (int y = 0; y < numRows; y++) { 200 for (int x = 0; x < numCols; x++) { 158 201 for (int u = -size; u <= size; u++) { 159 202 if ((x-u >= 0)&&(x-u < numCols)) { 160 203 if (convolution_direction == 1) { 204 // And here 161 205 imageC1->data.F32[y][x] += kernelVec->data.F32[u + size] * temp->data.F32[y][x - u]; 206 varC1->data.F32[y][x] += kernelVec->data.F32[u + size] * temp->data.F32[y][x - u]; 162 207 } 163 208 else if (convolution_direction == 2) { 209 // And here 164 210 imageC2->data.F32[y][x] += kernelVec->data.F32[u + size] * temp->data.F32[y][x - u]; 211 varC2->data.F32[y][x] += kernelVec->data.F32[u + size] * temp->data.F32[y][x - u]; 165 212 } 166 213 } … … 171 218 psFree(kernelVec); 172 219 220 // 221 // Do normalization 222 float normalization = 1.0; 223 224 // Something with the source list here 225 226 // Apply normalization 227 if (normalization != 1.0) { 228 for (int y = 0; y < numRows; y++) { 229 for (int x = 0; x < numCols; x++) { 230 if ((conv1)&&((convolution_direction == 1))) { 231 imageC1->data.F32[y][x] *= normalization; 232 } 233 else if ((conv2)&&(convolution_direction == 2)) { 234 imageC2->data.F32[y][x] *= normalization; 235 } 236 } 237 } 238 } 239 240 241 // 173 242 // Make a fake pmSubtractionKernels element so we can add it appropriately. 174 243 // I call it fake because we've successfully done everything at this point … … 199 268 kernels->solution1->data.F32[1] = 0.0; 200 269 kernels->solution1->data.F32[2] = 0.0; 201 /* kernels->solution2 = psVectorAlloc(3,PS_TYPE_F64); */202 /* kernels->solution2->data.F32[0] = 1.0; */203 270 kernels->solution1err = psVectorAlloc(3,PS_TYPE_F32); 204 271 kernels->solution1err->data.F32[0] = 0.0; 205 272 kernels->solution1err->data.F32[1] = 0.0; 206 273 kernels->solution1err->data.F32[2] = 0.0; 207 /* kernels->solution2err = psVectorAlloc(3,PS_TYPE_F32); */ 208 /* kernels->solution2err->data.F32[0] = 0.0; */ 209 /* kernels->solution2err->data.F32[1] = 0.0; */ 210 /* kernels->solution2err->data.F32[2] = 0.0; */ 211 212 274 275 // 213 276 // Actually add it to the headers 214 215 277 psMetadata *outAnalysis = psMetadataAlloc(); 216 278 psMetadata *outHeader = psMetadataAlloc(); … … 248 310 psFree(outAnalysis); 249 311 psFree(outHeader); 312 313 // 250 314 // Return 251 252 315 return(true); 253 316 }
Note:
See TracChangeset
for help on using the changeset viewer.
