00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifdef HAVE_CONFIG_H
00029 #include <config.h>
00030 #endif
00031
00032
00033
00034
00035
00036 #include <float.h>
00037 #include <string.h>
00038 #include <math.h>
00039 #include <cpl.h>
00040
00041 #include "hawki_variance.h"
00042
00043
00047
00048
00051
00079
00080 cpl_image * hawki_image_create_variance
00081 (const cpl_image * image,
00082 double gain,
00083 double ron,
00084 int ndit,
00085 int ndsamples)
00086 {
00087 cpl_image * variance;
00088 float * variance_p;
00089 const float * image_p;
00090 int pix;
00091 int npix;
00092 double poisson_contrib;
00093 double poisson_factor;
00094 double ron_contrib;
00095
00096
00097
00098 if (image == NULL) return NULL;
00099
00100
00101 variance = cpl_image_duplicate(image);
00102
00103
00104 variance_p = cpl_image_get_data(variance);
00105 image_p = cpl_image_get_data_const(image);
00106 npix = cpl_image_get_size_x(image) * cpl_image_get_size_y(image);
00107
00108
00109 ron_contrib = 12 * ron * ron / (gain * gain * ndsamples * ndit) *
00110 (ndsamples - 1) / (ndsamples + 1);
00111 poisson_factor = 6. / (5. * gain * ndsamples * ndit) *
00112 (ndsamples * ndsamples + 1) / (ndsamples + 1);
00113 for(pix = 0; pix < npix; ++pix)
00114 {
00115
00116 poisson_contrib = poisson_factor * fabs(image_p[pix]);
00117 variance_p[pix] = poisson_contrib + ron_contrib;
00118 }
00119
00120
00121 return variance;
00122 }
00123
00124
00157
00158 cpl_imagelist * hawki_imglist_create_variances_and_delete
00159 (cpl_imagelist * imagelist_raw,
00160 double gain,
00161 double ron,
00162 int ndit,
00163 int ndsamples)
00164 {
00165 cpl_imagelist * variances;
00166
00167 variances = cpl_imagelist_new();
00168
00169 while(cpl_imagelist_get_size(imagelist_raw) > 0)
00170 {
00171 cpl_image * variance;
00172
00173 variance = hawki_image_create_variance
00174 (cpl_imagelist_get(imagelist_raw, 0), gain, ron, ndit, ndsamples);
00175 cpl_imagelist_set(variances, variance,
00176 cpl_imagelist_get_size(variances));
00177 cpl_image_delete(cpl_imagelist_unset(imagelist_raw, 0));
00178 }
00179 return variances;
00180 }
00181
00182