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 <stdio.h>
00037 #include <stdlib.h>
00038 #include <math.h>
00039
00040 #include "omega_dfs.h"
00041 #include "omega_stats.h"
00042 #include "omega_utils.h"
00043
00044
00059
00062
00063
00064
00065
00066
00067
00068
00069
00082
00083 cpl_stats * omega_iter_stat(cpl_image *img, double threshold, int iter)
00084 {
00085
00086 int i = 0;
00087 double mean = 0.0;
00088 double median = 0.0;
00089 double stdev = 0.0;
00090
00091 cpl_mask *mask;
00092 cpl_image *image;
00093 cpl_stats *stats = NULL;
00094
00095 if(img == NULL)
00096 return NULL;
00097
00098 image = cpl_image_duplicate(img);
00099
00100 stats = cpl_stats_new_from_image(image, CPL_STATS_ALL);
00101
00102 for(i=0; i<iter; i++){
00103 mean = cpl_stats_get_mean(stats);
00104 median = cpl_stats_get_median(stats);
00105 stdev = cpl_stats_get_stdev(stats);
00106
00107 mask = cpl_mask_threshold_image_create(image,median-threshold*stdev,median+threshold*stdev);
00108 cpl_mask_not(mask);
00109 cpl_image_reject_from_mask(image, mask);
00110 freemask(mask);
00111
00112 freestats(stats);
00113
00114 stats = cpl_stats_new_from_image(image, CPL_STATS_ALL);
00115 if((abs(stdev/cpl_stats_get_stdev(stats)-1) <0.01)){
00116 break;
00117 }
00118
00119 }
00120
00121 freeimage(image);
00122
00123 return stats;
00124 }
00125
00126
00139
00140 cpl_stats * omega_iter_stat_opts(cpl_image *img, cpl_vector *zone, double threshold, int iter)
00141 {
00142
00143 int x0 = 0;
00144 int zy0 = 0;
00145 int x1 = 0;
00146 int zy1 = 0;
00147 int i = 0;
00148 double mean = 0.0;
00149 double median = 0.0;
00150 double stdev = 0.0;
00151
00152 cpl_mask *mask;
00153 cpl_stats *stats = NULL;
00154 cpl_image *image;
00155
00156 if(img == NULL)
00157 return NULL;
00158
00159 image = cpl_image_duplicate(img);
00160
00161
00162 if(zone != NULL){
00163 x0 = (int)cpl_vector_get(zone,0);
00164 zy0 = (int)cpl_vector_get(zone,1);
00165 x1 = (int)cpl_vector_get(zone,2);
00166 zy1 = (int)cpl_vector_get(zone,3);
00167 stats = cpl_stats_new_from_image_window(image, CPL_STATS_ALL,x0,zy0,x1,zy1);
00168 }
00169 else{
00170 stats = cpl_stats_new_from_image(image, CPL_STATS_ALL);
00171 }
00172
00173 for(i=0; i<iter; i++){
00174
00175 mean = cpl_stats_get_mean(stats);
00176 median = cpl_stats_get_median(stats);
00177 stdev = cpl_stats_get_stdev(stats);
00178
00179 mask = cpl_mask_threshold_image_create(image,median-threshold*stdev,median+threshold*stdev);
00180 cpl_mask_not(mask);
00181 cpl_image_reject_from_mask(image, mask);
00182 freemask(mask);
00183 freestats(stats);
00184
00185 if(zone != NULL){
00186 stats = cpl_stats_new_from_image_window(image, CPL_STATS_ALL,x0,zy0,x1,zy1);
00187 }
00188 else{
00189 stats = cpl_stats_new_from_image(image, CPL_STATS_ALL);
00190 }
00191 if( (abs(mean/cpl_stats_get_mean(stats)-1) < 0.01) &&
00192 (abs(stdev/cpl_stats_get_stdev(stats)-1) < 0.01) ){
00193 break;
00194 }
00195
00196 }
00197
00198 freeimage(image);
00199
00200 return stats;
00201 }
00202
00203
00204
00205
00206 float get_median_float(float *a, int n)
00207 {
00208 return get_kth_float(a,n,(((n)&1)?((n)/2):(((n)/2)-1)));
00209 }
00210
00219
00220 float get_kth_float(float *a, int n, int k)
00221 {
00222 const char *_id = "get_kth_float:";
00223 register float x ;
00224 register int i, j, l, m ;
00225
00226
00227
00228 if(a == NULL){
00229 cpl_msg_error("","%s Error in input for median of array",_id);
00230 return 0;
00231 }
00232
00233 l=0 ; m=n-1 ;
00234 while (l<m) {
00235 x=a[k] ;
00236 i=l ;
00237 j=m ;
00238 do {
00239 while (a[i]<x) i++ ;
00240 while (x<a[j]) j-- ;
00241 if (i<=j) {
00242 FLOAT_SWAP(a[i],a[j]) ;
00243 i++ ; j-- ;
00244 }
00245 } while (i<=j) ;
00246 if (j<k) l=i ;
00247 if (k<i) m=j ;
00248 }
00249
00250 return a[k] ;
00251 }