- Timestamp:
- Jan 2, 2010, 6:13:37 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/eam_branches/20091201/psModules/src/imcombine/pmSubtractionKernels.c
r26491 r26502 132 132 kernels->preCalc->data[index] = NULL; 133 133 kernels->penalties->data.F32[index] = kernels->penalty * PS_SQR(PS_SQR(u) + PS_SQR(v)); 134 if (!isfinite(kernels->penalties->data.F32[index])) { 135 psAbort ("invalid penalty"); 136 } 134 137 135 138 psTrace("psModules.imcombine", 7, "Kernel %d: %d %d\n", index, u, v); … … 146 149 } 147 150 148 bool pmSubtractionKernelPreCalcNormalize (pmSubtractionKernels *kernels, pmSubtractionKernelPreCalc *preCalc, int index, int size, int uOrder, int vOrder, float fwhm ) {151 bool pmSubtractionKernelPreCalcNormalize (pmSubtractionKernels *kernels, pmSubtractionKernelPreCalc *preCalc, int index, int size, int uOrder, int vOrder, float fwhm, bool AlardLuptonStyle) { 149 152 150 153 // Calculate moments … … 157 160 } 158 161 159 // Normalize sum of kernel component to unity for even functions 160 if (uOrder % 2 == 0 && vOrder % 2 == 0) { 161 double sum = 0.0; // Sum of kernel component 162 for (int v = -size; v <= size; v++) { 163 for (int u = -size; u <= size; u++) { 164 sum += preCalc->kernel->kernel[v][u]; 165 } 166 } 167 sum = 1.0 / sqrt(sum); 168 psBinaryOp(preCalc->xKernel, preCalc->xKernel, "*", psScalarAlloc(sum, PS_TYPE_F32)); 169 psBinaryOp(preCalc->yKernel, preCalc->yKernel, "*", psScalarAlloc(sum, PS_TYPE_F32)); 170 psBinaryOp(preCalc->kernel->image, preCalc->kernel->image, "*", psScalarAlloc(PS_SQR(sum), PS_TYPE_F32)); 171 172 #if 1 173 fprintf(stderr, "%d norm: %lf, null: %f\n", index, sum, preCalc->kernel->kernel[0][0]); 174 #endif 175 176 preCalc->kernel->kernel[0][0] -= 1.0; 177 moment *= PS_SQR(sum); 178 } 179 180 #if 1 162 // we have 4 cases here: 163 // 1) for odd functions, normalize the kernel by the maximum swing / Npix 164 // 2) for even functions, normalize the kernel to unity 165 // 3) for alard-lupton style normalization, subtract 1 from the 0,0 pixel for all even functions 166 // 4) for deconvolved hermitians, subtract 1 from the 0,0 pixel for the 0,0 function(s) 167 181 168 double sum = 0.0; // Sum of kernel component 169 double min = FLT_MAX; 170 double max = FLT_MIN; 171 182 172 for (int v = -size; v <= size; v++) { 183 173 for (int u = -size; u <= size; u++) { 184 174 sum += preCalc->kernel->kernel[v][u]; 175 min = PS_MIN(preCalc->kernel->kernel[v][u], min); 176 max = PS_MAX(preCalc->kernel->kernel[v][u], max); 185 177 } 186 178 } 187 fprintf(stderr, "%d sum: %lf\n", index, sum); 179 #if 1 180 fprintf(stderr, "%d raw: %lf, null: %f, min: %lf, max: %lf, moment: %lf\n", index, sum, preCalc->kernel->kernel[0][0], min, max, moment); 181 #endif 182 183 // only even terms have non-zero sums 184 if ((uOrder % 2 == 0) && (vOrder % 2 == 0)) { 185 moment /= sum; 186 } else { 187 moment = 0.0; 188 } 189 190 bool zeroNull = false; 191 float scale1D = 1.0 / sqrt(sum); 192 float scale2D = 1.0 / sum; 193 194 if (AlardLuptonStyle && (uOrder % 2 == 0 && vOrder % 2 == 0)) { 195 zeroNull = true; 196 } 197 if (!AlardLuptonStyle && (uOrder == 0 && vOrder == 0)) { 198 zeroNull = true; 199 } 200 if ((uOrder % 2) || (vOrder % 2)) { 201 // scale2D = 1.0 / (preCalc->kernel->image->numCols * preCalc->kernel->image->numRows * max); 202 scale2D = 1.0 / max; 203 scale1D = sqrt(scale2D); 204 } 205 206 psBinaryOp(preCalc->xKernel, preCalc->xKernel, "*", psScalarAlloc(scale1D, PS_TYPE_F32)); 207 psBinaryOp(preCalc->yKernel, preCalc->yKernel, "*", psScalarAlloc(scale1D, PS_TYPE_F32)); 208 psBinaryOp(preCalc->kernel->image, preCalc->kernel->image, "*", psScalarAlloc(scale2D, PS_TYPE_F32)); 209 if (zeroNull) { 210 preCalc->kernel->kernel[0][0] -= 1.0; 211 } 212 213 #if 1 214 sum = 0.0; // Sum of kernel component 215 min = FLT_MAX; 216 max = FLT_MIN; 217 for (int v = -size; v <= size; v++) { 218 for (int u = -size; u <= size; u++) { 219 sum += preCalc->kernel->kernel[v][u]; 220 min = PS_MIN(preCalc->kernel->kernel[v][u], min); 221 max = PS_MAX(preCalc->kernel->kernel[v][u], max); 222 } 223 } 224 fprintf(stderr, "%d mod: %lf, null: %f, min: %lf, max: %lf, scale: %f\n", index, sum, preCalc->kernel->kernel[0][0], min, max, scale2D); 188 225 #endif 189 226 … … 196 233 kernels->preCalc->data[index] = preCalc; 197 234 kernels->penalties->data.F32[index] = kernels->penalty * fabsf(moment); 235 if (!isfinite(kernels->penalties->data.F32[index])) { 236 psAbort ("invalid penalty"); 237 } 198 238 199 239 psTrace("psModules.imcombine", 7, "Kernel %d: %f %d %d %f\n", index, … … 250 290 251 291 pmSubtractionKernelPreCalc *preCalc = pmSubtractionKernelPreCalcAlloc(PM_SUBTRACTION_KERNEL_ISIS, uOrder, vOrder, size, sigma); // structure to hold precalculated values 252 pmSubtractionKernelPreCalcNormalize (kernels, preCalc, index, size, uOrder, vOrder, fwhms->data.F32[i] );292 pmSubtractionKernelPreCalcNormalize (kernels, preCalc, index, size, uOrder, vOrder, fwhms->data.F32[i], true); 253 293 } 254 294 } … … 302 342 for (int vOrder = 0; vOrder <= orders->data.S32[i] - uOrder; vOrder++, index++) { 303 343 pmSubtractionKernelPreCalc *preCalc = pmSubtractionKernelPreCalcAlloc(PM_SUBTRACTION_KERNEL_HERM, uOrder, vOrder, size, sigma); // structure to hold precalculated values 304 pmSubtractionKernelPreCalcNormalize (kernels, preCalc, index, size, uOrder, vOrder, fwhms->data.F32[i] );344 pmSubtractionKernelPreCalcNormalize (kernels, preCalc, index, size, uOrder, vOrder, fwhms->data.F32[i], true); 305 345 } 306 346 } … … 338 378 int gaussOrder = orders->data.S32[i]; // Polynomial order to apply to Gaussian 339 379 psStringAppend(¶ms, "(%.1f,%d)", fwhms->data.F32[i], orders->data.S32[i]); 340 num += (gaussOrder + 1) * (gaussOrder + 2) / 2;380 num += PS_SQR(gaussOrder + 1); 341 381 } 342 382 … … 349 389 // XXXXX hard-wired reference sigma for now of 1.7 pix (== 4.0 pix fwhm == 1.0 arcsec in simtest) 350 390 // generate the Gaussian deconvolution kernel 351 # define DECONV_SIGMA 1. 7391 # define DECONV_SIGMA 1.6 352 392 psKernel *kernelGauss = pmSubtractionDeconvolveGauss (size, DECONV_SIGMA); 393 394 # if 1 395 psArray *deconKernels = psArrayAllocEmpty(100); 396 # endif 353 397 354 398 // Set the kernel parameters … … 357 401 // Iterate over (u,v) order 358 402 for (int uOrder = 0; uOrder <= orders->data.S32[i]; uOrder++) { 359 for (int vOrder = 0; vOrder <= orders->data.S32[i] - uOrder; vOrder++, index++) {403 for (int vOrder = 0; vOrder <= orders->data.S32[i]; vOrder++, index++) { 360 404 361 405 pmSubtractionKernelPreCalc *preCalc = pmSubtractionKernelPreCalcAlloc(PM_SUBTRACTION_KERNEL_HERM, uOrder, vOrder, size, sigma); // structure to hold precalculated values … … 365 409 preCalc->kernel = pmSubtractionDeconvolveKernel(kernelTarget, kernelGauss); // Kernel 366 410 411 pmSubtractionKernelPreCalcNormalize (kernels, preCalc, index, size, uOrder, vOrder, fwhms->data.F32[i], false); 412 367 413 // XXXX test demo that deconvolved kernel is valid 368 // psImage *kernelConv = psImageConvolveFFT(NULL, preCalc->kernel->image, NULL, 0, kernelGauss); 369 // pmSubtractionVisualShowSubtraction (kernelTarget->image, preCalc->kernel->image, kernelConv); 370 371 pmSubtractionKernelPreCalcNormalize (kernels, preCalc, index, size, uOrder, vOrder, fwhms->data.F32[i]); 414 # if 1 415 psImage *kernelConv = psImageConvolveFFT(NULL, preCalc->kernel->image, NULL, 0, kernelGauss); 416 psArrayAdd (deconKernels, 100, kernelConv); 417 psFree (kernelConv); 418 419 if (!uOrder && !vOrder){ 420 pmSubtractionVisualShowSubtraction (kernelTarget->image, preCalc->kernel->image, kernelConv); 421 } 422 # endif 372 423 } 373 424 } 374 425 } 426 427 # if 1 428 psImage *dot = psImageAlloc(deconKernels->n, deconKernels->n, PS_TYPE_F32); 429 for (int i = 0; i < deconKernels->n; i++) { 430 for (int j = 0; j <= i; j++) { 431 psImage *t1 = deconKernels->data[i]; 432 psImage *t2 = deconKernels->data[j]; 433 434 double sum = 0.0; 435 for (int iy = 0; iy < t1->numRows; iy++) { 436 for (int ix = 0; ix < t1->numCols; ix++) { 437 sum += t1->data.F32[iy][ix] * t2->data.F32[iy][ix]; 438 } 439 } 440 dot->data.F32[j][i] = sum; 441 dot->data.F32[i][j] = sum; 442 } 443 } 444 pmSubtractionVisualShowSubtraction (dot, NULL, NULL); 445 psFree (dot); 446 psFree (deconKernels); 447 # endif 375 448 376 449 return kernels; … … 857 930 kernels->v->data.S32[index] = vOrder; 858 931 kernels->penalties->data.F32[index] = kernels->penalty * fabsf(moment); 932 if (!isfinite(kernels->penalties->data.F32[index])) { 933 psAbort ("invalid penalty"); 934 } 859 935 860 936 psTrace("psModules.imcombine", 7, "Kernel %d: %d %d %d\n", index,
Note:
See TracChangeset
for help on using the changeset viewer.
