IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Mar 31, 2019, 8:47:40 AM (7 years ago)
Author:
eugene
Message:

add vwtmean, virls, medimage wtmean & irls options, spline print

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/eam_branches/ohana.20190329/src/opihi/cmd.data/medimage_commands.c

    r40661 r40662  
    11# include "data.h"
     2
     3float weight_cauchy_square_flt (float x2);
     4float irls_mean (float *val, float *wgt, int N);
     5
     6# define IRLS_TOLERANCE 1e-4
    27
    38int medimage_list (int argc, char **argv) {
     
    1520int medimage_add (int argc, char **argv) {
    1621
     22  int N;
    1723  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);
    2329    remove_argument (N, &argc, argv);
    2430  }
    2531
    2632  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");
    2834    gprint (GP_ERR, "       add the given image to the set of images to be medianed\n");
    2935    gprint (GP_ERR, "       optionally supply variance image (for weighted calculations)\n");
     
    3339  if ((image = SelectBuffer (argv[2], OLDBUFFER, TRUE)) == NULL) return (FALSE);
    3440
    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  }
    3648
    3749  MedImageType *median = FindMedImage (argv[1]);
     
    5668  // new image should match existing medimage dimensions
    5769
     70  // AddMedImage (median, image, sig);
    5871  int Ninput = median->Ninput;
    5972  median->Ninput ++;
     73  REALLOCATE (median->flx, float *, median->Ninput);
    6074  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
     88enum {CALC_MEDIAN, CALC_MEAN, CALC_IRLS, CALC_WTMEAN};
    7589int medimage_calc (int argc, char **argv) {
    7690
    7791  int ix, iy, n, N;
    7892  Buffer *output;
    79 
    80   int CALC_MEAN = FALSE;
     93 
     94  int mode = CALC_MEDIAN;
    8195  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;
    83107    remove_argument (N, &argc, argv);
    84108  }
    85109
    86110  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");
    88112    gprint (GP_ERR, "       calculate the median image for the median image set\n");
    89113    return FALSE;
     
    102126  int Ny = median->Ny;
    103127
    104   float *value = NULL;
    105   ALLOCATE (value, float, Ninput);
     128  ALLOCATE_PTR (val, float, Ninput);
     129  ALLOCATE_PTR (wgt, float, Ninput);
    106130
    107131  gfits_free_matrix (&output->matrix);
     
    117141      int Npix = ix + Nx*iy;
    118142      for (n = 0; n < Ninput; n++) {
    119         float v = median->sig[n][Npix];
     143        float v = median->flx[n][Npix];
    120144        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        }
    122153        N++;
    123154      }
    124155      if (N == 0) continue;
    125156
    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;
    134169        }
    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);
    139181      }
    140182    }
    141183  }
    142 
    143   return TRUE;
    144 }
     184  return TRUE;
     185}
     186
     187float 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
     232float weight_cauchy_square_flt (float x2) {
     233  float r2 = x2 / CAUCY_FACTOR;
     234  return (1.0 / (1.0 + r2));
     235}
     236
    145237
    146238/*
    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   }
    182274*/
    183275
Note: See TracChangeset for help on using the changeset viewer.