68 #include <uves_error.h>
70 #include <uves_utils_wrappers.h>
85 #define MAX_ITERATIONS 6
114 cpl_image* laplacian_image = NULL;
115 cpl_image* laplacian_redu_image = NULL;
116 cpl_image* two_sub_sample = NULL;
117 cpl_image* sci_median5_image = NULL;
118 cpl_image* noise_image = NULL;
119 cpl_image* s_image = NULL;
120 cpl_image* s_median_image = NULL;
121 cpl_image* s2_image = NULL;
122 cpl_image* sci_median3_image = NULL;
123 cpl_image* sci_median3_7_image = NULL;
124 cpl_image* f_image = NULL;
125 cpl_image* r_image = NULL;
126 int two_sub_sample_nx = 0;
127 int two_sub_sample_ny = 0;
129 float* sci_data = NULL;
130 float* two_sub_sample_data = NULL;
131 float* laplacian_data = NULL;
132 float* laplacian_redu_data = NULL;
133 float* sci_median5_data = NULL;
134 float* sci_median3_data = NULL;
135 float* sci_median3_7_data = NULL;
136 float* noise_data = NULL;
137 float* s_data = NULL;
138 float* s_median_data = NULL;
139 float* s2_data = NULL;
140 float* f_data = NULL;
141 float* r_data = NULL;
143 float* cosmic_data = NULL;
145 cpl_matrix* laplacian_kernel = NULL;
146 cpl_matrix* median3_kernel = NULL;
147 cpl_matrix* median5_kernel = NULL;
148 cpl_matrix* median7_kernel = NULL;
149 int new_crh =1, nb_crh = 0;
151 cpl_vector* median = NULL;
155 cpl_image* res_image=NULL;
158 cknull( sci_image,
"null input image" ) ; ;
160 uves_msg(
"Entering uves_remove_crh_single");
161 uves_msg(
" Params: frac_max %.1f, sigma_lim %.2f f_lim %.2f, iter %d",
162 crh_frac_max, sigma_lim, f_lim, max_iter);
165 nx=cpl_image_get_size_x(sci_image);
166 ny=cpl_image_get_size_y(sci_image);
169 check_nomsg( laplacian_kernel = cpl_matrix_new(3,3));
170 cpl_matrix_set( laplacian_kernel,0,0,0.0);
171 cpl_matrix_set( laplacian_kernel,0,1,-1.0);
172 cpl_matrix_set( laplacian_kernel,0,2,0.0);
173 cpl_matrix_set( laplacian_kernel,1,0,-1.0);
174 cpl_matrix_set( laplacian_kernel,1,1,4.0);
175 cpl_matrix_set( laplacian_kernel,1,2,-1.0);
176 cpl_matrix_set( laplacian_kernel,2,0,0.0);
177 cpl_matrix_set( laplacian_kernel,2,1,-1.0);
178 cpl_matrix_set( laplacian_kernel,2,2,0.0);
179 cpl_matrix_divide_scalar( laplacian_kernel, 4.0);
193 check_nomsg( median3_kernel = cpl_matrix_new(3,3));
196 cpl_matrix_set( median3_kernel, i,j,1.0);
201 check_nomsg( median5_kernel = cpl_matrix_new(5,5));
204 cpl_matrix_set( median5_kernel, i,j,1.0);
209 check_nomsg( median7_kernel = cpl_matrix_new(7,7));
212 cpl_matrix_set( median7_kernel, i,j,1.0);
216 check_nomsg (res_image = cpl_image_duplicate( sci_image));
219 check_nomsg (sci_data = cpl_image_get_data_float( res_image));
221 two_sub_sample_nx = nx*2;
222 two_sub_sample_ny = ny*2;
223 check_nomsg( two_sub_sample = cpl_image_new( two_sub_sample_nx,
224 two_sub_sample_ny, CPL_TYPE_FLOAT));
225 check_nomsg(two_sub_sample_data = cpl_image_get_data_float( two_sub_sample));
226 check_nomsg( laplacian_redu_image = cpl_image_new(nx,ny, CPL_TYPE_FLOAT));
227 check_nomsg(laplacian_redu_data = cpl_image_get_data_float(
228 laplacian_redu_image));
229 check_nomsg( noise_image = cpl_image_new(nx,ny, CPL_TYPE_FLOAT));
230 check_nomsg( noise_data = cpl_image_get_data_float( noise_image));
231 check_nomsg( s_image = cpl_image_new(nx,ny, CPL_TYPE_FLOAT));
232 check_nomsg( s_data = cpl_image_get_data_float( s_image));
233 check_nomsg( s2_image = cpl_image_new(nx,ny, CPL_TYPE_FLOAT));
234 check_nomsg( s2_data = cpl_image_get_data_float( s2_image));
235 check_nomsg( f_image = cpl_image_new(nx,ny, CPL_TYPE_FLOAT));
236 check_nomsg( f_data = cpl_image_get_data_float( f_image));
237 check_nomsg( r_image = cpl_image_new(nx,ny, CPL_TYPE_FLOAT));
238 check_nomsg( r_data = cpl_image_get_data_float( r_image));
239 cosmic_data=cpl_calloc(nx*ny,
sizeof(
float));
242 while( new_crh > 0 && frac < crh_frac_max && nbiter <= max_iter ){
250 for( j=0; j< ny; j++){
251 for( i=0; i< nx; i++){
252 float val = sci_data[i+j*nx];
254 if ( val < 0. ) val = 0. ;
255 two_sub_sample_data[i*2+j*2*two_sub_sample_nx] = val;
256 two_sub_sample_data[i*2+1+j*2*two_sub_sample_nx] = val;
257 two_sub_sample_data[i*2+(j*2+1)*two_sub_sample_nx] = val;
258 two_sub_sample_data[i*2+1+(j*2+1)*two_sub_sample_nx] = val;
266 check_nomsg(laplacian_image = uves_image_filter_linear( two_sub_sample,
272 check_nomsg (laplacian_data = cpl_image_get_data_float( laplacian_image));
273 for ( i=0; i< two_sub_sample_nx*two_sub_sample_ny; i++){
274 if (laplacian_data[i] > 0.0){
275 laplacian_data[i] = 2.0 * laplacian_data[i];
278 laplacian_data[i] = 0.0;
282 cpl_image_save(laplacian_image,
"Lpositive.fits", CPL_BPP_IEEE_FLOAT, NULL,
293 for( j=0; j< ny; j++){
294 for( i=0; i< nx; i++){
295 laplacian_redu_data[i+j*nx] =
296 (laplacian_data[i*2+j*2*two_sub_sample_nx]+
297 laplacian_data[i*2+1+j*2*two_sub_sample_nx]+
298 laplacian_data[i*2+(j*2+1)*two_sub_sample_nx]+
299 laplacian_data[i*2+1+(j*2+1)*two_sub_sample_nx])/4.0;
303 cpl_image_save(laplacian_redu_image,
"Lplus.fits", CPL_BPP_IEEE_FLOAT,
304 NULL, CPL_IO_DEFAULT);
308 check_nomsg( sci_median5_image = uves_image_filter_median( sci_image,
310 check_nomsg (sci_median5_data = cpl_image_get_data_float( sci_median5_image));
314 for( i=0; i< nx*ny; i++){
315 noise_data[i] = sqrt(sci_median5_data[i]*gain+
321 for( i=0; i< nx*ny; i++){
322 s_data[i] = laplacian_redu_data[i] / (2.0*noise_data[i]);
327 check_nomsg( s_median_image = uves_image_filter_median( s_image,
329 check_nomsg( s_median_data = cpl_image_get_data_float( s_median_image));
333 for( i=0; i< nx*ny; i++){
334 s2_data[i] = s_data[i] -s_median_data[i];
337 cpl_image_save( s2_image,
"S2.fits", CPL_BPP_IEEE_FLOAT, NULL,
342 check_nomsg( sci_median3_image = uves_image_filter_median( sci_image,
347 check_nomsg( sci_median3_7_image = uves_image_filter_median( sci_median3_image,
350 check_nomsg ( sci_median3_data = cpl_image_get_data_float( sci_median3_image));
351 check_nomsg ( sci_median3_7_data = cpl_image_get_data_float(
352 sci_median3_7_image));
356 for( i=0; i< nx*ny; i++){
357 f_data[i] = sci_median3_data[i] -sci_median3_7_data[i];
358 if (f_data[i] < 0.01){
362 cpl_image_save( f_image,
"F.fits", CPL_BPP_IEEE_FLOAT, NULL,
367 for( i=0; i< nx*ny; i++){
368 r_data[i] = laplacian_redu_data[i]/f_data[i];
371 cpl_image_save( r_image,
"R.fits", CPL_BPP_IEEE_FLOAT, NULL,
378 median = cpl_vector_new(24);
380 for( j=1; j< ny-1; j++){
382 cpl_vector* med_vect = NULL;
384 for( i=1; i< nx-1; i++){
385 if ( (s2_data[i+j*nx] >= sigma_lim) &&
386 (r_data[i+j*nx] >= f_lim)){
388 cosmic_data[i+j*nx] = 1.0;
396 if (ui >= nx) ui = nx-1;
398 if (uj >= ny) uj = ny-1;
399 for( k=lj; k <= uj; k++){
400 for( l=li; l <= ui; l++){
403 cpl_vector_set(median, m, sci_data[l+k*nx]);
406 else if ( (k == j) && ( l < i)){
407 cpl_vector_set(median, m, sci_data[l+k*nx]);
410 else if ( l!=i && k!=j && (s2_data[l+k*nx] < sigma_lim)
411 && (r_data[l+k*nx] < f_lim)){
412 cpl_vector_set(median, m, sci_data[l+k*nx]);
419 check_nomsg( med_vect = cpl_vector_wrap( m, data));
420 check_nomsg( sci_data[i+j*nx] = cpl_vector_get_median( med_vect));
421 cpl_vector_unwrap( med_vect);
425 uves_free_vector( &median ) ;
427 frac = (double)nb_crh/(
double)(nx*ny) ;
428 uves_msg(
" new cosmics %d, total %d, frac %.4f [%d pixels]",new_crh,nb_crh,
431 uves_free_image( &laplacian_image);
432 uves_free_image( &sci_median3_7_image ) ;
433 uves_free_image( &sci_median3_image ) ;
434 uves_free_image( &s_median_image ) ;
435 uves_free_image( &sci_median5_image ) ;
440 debug = fopen(
"cosmic.log",
"w");
442 for( j=0; j< ny; j++){
443 for( i=0; i< nx; i++){
444 if ( cosmic_data[i+j*nx] == 1.0){
445 fprintf(debug,
"%.1f %.1f\n",i+1.0,j+1.0);
465 uves_free_matrix( &laplacian_kernel);
466 uves_free_matrix( &median3_kernel);
467 uves_free_matrix( &median5_kernel);
468 uves_free_matrix( &median7_kernel);
470 uves_free_image( &laplacian_image);
471 uves_free_image( &laplacian_redu_image);
472 uves_free_image( &two_sub_sample);
473 uves_free_image( &sci_median5_image);
474 uves_free_image( &noise_image);
475 uves_free_image( &s_image);
476 uves_free_image( &s_median_image);
477 uves_free_image( &s2_image);
478 uves_free_image( &sci_median3_image);
479 uves_free_image( &sci_median3_7_image);
480 uves_free_image( &f_image);
481 uves_free_image( &r_image);
483 uves_free_vector( &median);
485 if(cosmic_data!=NULL) cpl_free( cosmic_data);
cpl_image * uves_remove_crh_single(cpl_image *sci_image, double crh_frac_max, double sigma_lim, double f_lim, int max_iter, double gain, double ron)
#define uves_msg(...)
Print a message on 'info' or 'debug' level.
#define uves_msg_debug(...)
Print a debug message.