- Timestamp:
- Mar 31, 2019, 8:47:40 AM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/eam_branches/ohana.20190329/src/opihi/cmd.data/medimage_commands.c
r40661 r40662 1 1 # include "data.h" 2 3 float weight_cauchy_square_flt (float x2); 4 float irls_mean (float *val, float *wgt, int N); 5 6 # define IRLS_TOLERANCE 1e-4 2 7 3 8 int medimage_list (int argc, char **argv) { … … 15 20 int medimage_add (int argc, char **argv) { 16 21 22 int N; 17 23 Buffer *image; 18 19 Buffer *var = NULL; 20 if ((N = get_argument (argc, argv, "- var"))) {21 remove_argument (N, &argc, argv); 22 if (( var= SelectBuffer (argv[N], OLDBUFFER, TRUE)) == NULL) return (FALSE);24 Buffer *sig = NULL; 25 26 if ((N = get_argument (argc, argv, "-sigma"))) { 27 remove_argument (N, &argc, argv); 28 if ((sig = SelectBuffer (argv[N], OLDBUFFER, TRUE)) == NULL) return (FALSE); 23 29 remove_argument (N, &argc, argv); 24 30 } 25 31 26 32 if (argc != 3) { 27 gprint (GP_ERR, "USAGE: medimage add (name) (image) [- var var]\n");33 gprint (GP_ERR, "USAGE: medimage add (name) (image) [-sigma sigma]\n"); 28 34 gprint (GP_ERR, " add the given image to the set of images to be medianed\n"); 29 35 gprint (GP_ERR, " optionally supply variance image (for weighted calculations)\n"); … … 33 39 if ((image = SelectBuffer (argv[2], OLDBUFFER, TRUE)) == NULL) return (FALSE); 34 40 35 XXX: match dimensions wit var image 41 if (sig) { 42 if ((sig->matrix.Naxis[0] != image->matrix.Naxis[0]) || 43 (sig->matrix.Naxis[1] != image->matrix.Naxis[1])) { 44 gprint (GP_ERR, "sigma buffer does not match image buffer dimensions\n"); 45 return FALSE; 46 } 47 } 36 48 37 49 MedImageType *median = FindMedImage (argv[1]); … … 56 68 // new image should match existing medimage dimensions 57 69 70 // AddMedImage (median, image, sig); 58 71 int Ninput = median->Ninput; 59 72 median->Ninput ++; 73 REALLOCATE (median->flx, float *, median->Ninput); 60 74 REALLOCATE (median->sig, float *, median->Ninput); 61 REALLOCATE (median->var, float *, median->Ninput); 62 63 ALLOCATE (median->sig[Ninput], float,median->Nx*median->Ny);64 memcpy (median->sig[Ninput], image->matrix.buffer, sizeof(float)*median->Nx*median->Ny); 65 66 median->var[Ninput] = NULL;67 if (var) {68 ALLOCATE (median->var[Ninput], float,median->Nx*median->Ny);69 memcpy (median->var[Ninput], var->matrix.buffer, sizeof(float)*median->Nx*median->Ny);70 } 71 72 return TRUE; 73 } 74 75 76 ALLOCATE (median->flx[Ninput], float, median->Nx*median->Ny); 77 memcpy (median->flx[Ninput], image->matrix.buffer, sizeof(float)*median->Nx*median->Ny); 78 79 median->sig[Ninput] = NULL; 80 if (sig) { 81 ALLOCATE (median->sig[Ninput], float, median->Nx*median->Ny); 82 memcpy (median->sig[Ninput], sig->matrix.buffer, sizeof(float)*median->Nx*median->Ny); 83 } 84 85 return TRUE; 86 } 87 88 enum {CALC_MEDIAN, CALC_MEAN, CALC_IRLS, CALC_WTMEAN}; 75 89 int medimage_calc (int argc, char **argv) { 76 90 77 91 int ix, iy, n, N; 78 92 Buffer *output; 79 80 int CALC_MEAN = FALSE;93 94 int mode = CALC_MEDIAN; 81 95 if ((N = get_argument (argc, argv, "-mean"))) { 82 CALC_MEAN = TRUE; 96 mode = CALC_MEAN; 97 remove_argument (N, &argc, argv); 98 } 99 if ((N = get_argument (argc, argv, "-irls"))) { 100 if (mode != CALC_MEDIAN) { gprint (GP_ERR, "supply only one of -mean, -irls, -wtmean\n"); return FALSE; } 101 mode = CALC_IRLS; 102 remove_argument (N, &argc, argv); 103 } 104 if ((N = get_argument (argc, argv, "-wtmean"))) { 105 if (mode != CALC_MEDIAN) { gprint (GP_ERR, "supply only one of -mean, -irls, -wtmean\n"); return FALSE; } 106 mode = CALC_WTMEAN; 83 107 remove_argument (N, &argc, argv); 84 108 } 85 109 86 110 if (argc != 3) { 87 gprint (GP_ERR, "USAGE: medimage calc (name) (output) [-mean ]\n");111 gprint (GP_ERR, "USAGE: medimage calc (name) (output) [-mean,-irls,-wtmean]\n"); 88 112 gprint (GP_ERR, " calculate the median image for the median image set\n"); 89 113 return FALSE; … … 102 126 int Ny = median->Ny; 103 127 104 float *value = NULL;105 ALLOCATE (value, float, Ninput);128 ALLOCATE_PTR (val, float, Ninput); 129 ALLOCATE_PTR (wgt, float, Ninput); 106 130 107 131 gfits_free_matrix (&output->matrix); … … 117 141 int Npix = ix + Nx*iy; 118 142 for (n = 0; n < Ninput; n++) { 119 float v = median-> sig[n][Npix];143 float v = median->flx[n][Npix]; 120 144 if (!isfinite(v)) continue; 121 value[N] = v; 145 val[N] = v; 146 wgt[N] = 1.0; 147 if (median->sig[n]) { 148 float s = median->sig[n][Npix]; 149 if (!isfinite(s)) continue; 150 if (fabs(s) < 2*FLT_MIN) s = 2*FLT_MIN; 151 wgt[N] = 1.0 / SQ(s); 152 } 122 153 N++; 123 154 } 124 155 if (N == 0) continue; 125 156 126 XXXX: add in calc options: 127 weighted mean 128 irls 129 130 if (CALC_MEAN) { 131 float sum = 0.0; 132 for (n = 0; n < N; n++) { 133 sum += value[n]; 157 switch (mode) { 158 case CALC_MEDIAN: 159 fsort (val, N); 160 outvalue[Npix] = val[(int)(0.5*N)]; 161 break; 162 case CALC_MEAN: { 163 float sum = 0.0; 164 for (n = 0; n < N; n++) { 165 sum += val[n]; 166 } 167 outvalue[Npix] = sum / (float) N; 168 break; 134 169 } 135 outvalue[Npix] = sum / (float) N; 136 } else { 137 fsort (value, N); 138 outvalue[Npix] = value[(int)(0.5*N)]; 170 case CALC_WTMEAN: { 171 float S1 = 0.0, S2 = 0.0; 172 for (n = 0; n < N; n++) { 173 S1 += wgt[n] * val[n]; 174 S2 += wgt[n]; 175 } 176 outvalue[Npix] = S1 / S2; 177 break; 178 } 179 case CALC_IRLS: 180 outvalue[Npix] = irls_mean (val, wgt, N); 139 181 } 140 182 } 141 183 } 142 143 return TRUE; 144 } 184 return TRUE; 185 } 186 187 float irls_mean (float *val, float *wgt, int N) { 188 189 // calculate weighted mean 190 float S1 = 0.0, S2 = 0.0; 191 for (int n = 0; n < N; n++) { 192 S1 += wgt[n] * val[n]; 193 S2 += wgt[n]; 194 } 195 float Value = S1 / S2; 196 197 int converged = FALSE; 198 for (int i = 0; (i < 10) && !converged; i++) { 199 float ValueLast = Value; 200 201 float S1 = 0.0, S2 = 0.0; 202 203 // calculate weight modification based on distances (squared). 204 // use modifier to calculate new weighted mean 205 for (int n = 0; n < N; n++) { 206 float dV = (val[n] - Value); 207 float d2 = SQ(dV) * wgt[n]; 208 209 float Mod = weight_cauchy_square_flt (d2); 210 S1 += Mod * wgt[n] * val[n]; 211 S2 += Mod * wgt[n]; 212 } 213 Value = S1 / S2; 214 215 float delta = fabs(Value - ValueLast); 216 if (delta < Value * IRLS_TOLERANCE) converged = TRUE; 217 } 218 return Value; 219 } 220 221 // exp(-(x^2/s^2)/2) = (1/2) 222 // -(x^2/s^2)/2 = ln(1/2) 223 // (x^2/s^2)/2 = ln(2) 224 // (x^2/s^2) = 2ln(2) 225 // (x /s) = sqrt(2ln(2)) : half-width at half-max 226 // FWHM = 2sqrt(2ln(2)) 227 228 // R2 = (X / 2.385)^2 = (X^2 / 2.385^2) 229 230 # define CAUCY_FACTOR 1.0 231 232 float weight_cauchy_square_flt (float x2) { 233 float r2 = x2 / CAUCY_FACTOR; 234 return (1.0 / (1.0 + r2)); 235 } 236 145 237 146 238 /* 147 int medimage_save (int argc, char **argv) {148 149 int N;150 151 int APPEND = FALSE;152 if ((N = get_argument (argc, argv, "-append"))) {153 APPEND = TRUE;154 remove_argument (N, &argc, argv);155 }156 157 if (argc != 3) {158 gprint (GP_ERR, "USAGE: medimage save (name) (filename) [-append]\n");159 return FALSE;160 }161 162 if (!SaveMedImage(argv[2], argv[1], APPEND)) {163 gprint (GP_ERR, "failed to save medimage %s\n", argv[1]);164 return (FALSE);165 }166 return TRUE;167 }168 169 int medimage_load (int argc, char **argv) {170 171 if (argc != 3) {172 gprint (GP_ERR, "USAGE: medimage load (name) (filename)\n");173 return FALSE;174 }175 176 if (!LoadMedImage(argv[2], argv[1])) {177 gprint (GP_ERR, "failed to load medimage %s\n", argv[1]);178 return (FALSE);179 }180 return TRUE;181 }239 int medimage_save (int argc, char **argv) { 240 241 int N; 242 243 int APPEND = FALSE; 244 if ((N = get_argument (argc, argv, "-append"))) { 245 APPEND = TRUE; 246 remove_argument (N, &argc, argv); 247 } 248 249 if (argc != 3) { 250 gprint (GP_ERR, "USAGE: medimage save (name) (filename) [-append]\n"); 251 return FALSE; 252 } 253 254 if (!SaveMedImage(argv[2], argv[1], APPEND)) { 255 gprint (GP_ERR, "failed to save medimage %s\n", argv[1]); 256 return (FALSE); 257 } 258 return TRUE; 259 } 260 261 int medimage_load (int argc, char **argv) { 262 263 if (argc != 3) { 264 gprint (GP_ERR, "USAGE: medimage load (name) (filename)\n"); 265 return FALSE; 266 } 267 268 if (!LoadMedImage(argv[2], argv[1])) { 269 gprint (GP_ERR, "failed to load medimage %s\n", argv[1]); 270 return (FALSE); 271 } 272 return TRUE; 273 } 182 274 */ 183 275
Note:
See TracChangeset
for help on using the changeset viewer.
