49 #include <sinfo_error.h>
50 #include <sinfo_msg.h>
51 #include <sinfo_utils_wrappers.h>
53 #include "sinfo_utilities.h"
57 cpl_image * sinfo_remove_crh_single( cpl_image * sci_image,
69 #define MAX_ITERATIONS 6
93 cpl_image * sinfo_remove_crh_single( cpl_image * sci_image,
107 cpl_image* laplacian_image = NULL;
108 cpl_image* laplacian_redu_image = NULL;
109 cpl_image* two_sub_sample = NULL;
110 cpl_image* sci_median5_image = NULL;
111 cpl_image* noise_image = NULL;
112 cpl_image* s_image = NULL;
113 cpl_image* s_median_image = NULL;
114 cpl_image* s2_image = NULL;
115 cpl_image* sci_median3_image = NULL;
116 cpl_image* sci_median3_7_image = NULL;
117 cpl_image* f_image = NULL;
118 cpl_image* r_image = NULL;
119 int two_sub_sample_nx = 0;
120 int two_sub_sample_ny = 0;
122 float* sci_data = NULL;
123 float* two_sub_sample_data = NULL;
124 float* laplacian_data = NULL;
125 float* laplacian_redu_data = NULL;
126 float* sci_median5_data = NULL;
127 float* sci_median3_data = NULL;
128 float* sci_median3_7_data = NULL;
129 float* noise_data = NULL;
130 float* s_data = NULL;
131 float* s_median_data = NULL;
132 float* s2_data = NULL;
133 float* f_data = NULL;
134 float* r_data = NULL;
136 float* cosmic_data = NULL;
138 cpl_matrix* laplacian_kernel = NULL;
139 cpl_matrix* median3_kernel = NULL;
140 cpl_matrix* median5_kernel = NULL;
141 cpl_matrix* median7_kernel = NULL;
142 int new_crh =1, nb_crh = 0;
144 cpl_vector* median = NULL;
148 cpl_image* res_image=NULL;
151 cknull( sci_image,
"null input image" ) ; ;
153 sinfo_msg(
"Entering sinfo_remove_crh_single");
154 sinfo_msg(
" Params: frac_max %.1f, sigma_lim %.2f f_lim %.2f, iter %d",
155 crh_frac_max, sigma_lim, f_lim, max_iter);
158 nx=cpl_image_get_size_x(sci_image);
159 ny=cpl_image_get_size_y(sci_image);
162 check_nomsg( laplacian_kernel = cpl_matrix_new(3,3));
163 cpl_matrix_set( laplacian_kernel,0,0,0.0);
164 cpl_matrix_set( laplacian_kernel,0,1,-1.0);
165 cpl_matrix_set( laplacian_kernel,0,2,0.0);
166 cpl_matrix_set( laplacian_kernel,1,0,-1.0);
167 cpl_matrix_set( laplacian_kernel,1,1,4.0);
168 cpl_matrix_set( laplacian_kernel,1,2,-1.0);
169 cpl_matrix_set( laplacian_kernel,2,0,0.0);
170 cpl_matrix_set( laplacian_kernel,2,1,-1.0);
171 cpl_matrix_set( laplacian_kernel,2,2,0.0);
172 cpl_matrix_divide_scalar( laplacian_kernel, 4.0);
186 check_nomsg( median3_kernel = cpl_matrix_new(3,3));
189 cpl_matrix_set( median3_kernel, i,j,1.0);
194 check_nomsg( median5_kernel = cpl_matrix_new(5,5));
197 cpl_matrix_set( median5_kernel, i,j,1.0);
202 check_nomsg( median7_kernel = cpl_matrix_new(7,7));
205 cpl_matrix_set( median7_kernel, i,j,1.0);
209 check_nomsg (res_image = cpl_image_duplicate( sci_image));
212 check_nomsg (sci_data = cpl_image_get_data_float( res_image));
214 two_sub_sample_nx = nx*2;
215 two_sub_sample_ny = ny*2;
216 check_nomsg( two_sub_sample = cpl_image_new( two_sub_sample_nx,
217 two_sub_sample_ny, CPL_TYPE_FLOAT));
218 check_nomsg(two_sub_sample_data = cpl_image_get_data_float( two_sub_sample));
219 check_nomsg( laplacian_redu_image = cpl_image_new(nx,ny, CPL_TYPE_FLOAT));
220 check_nomsg(laplacian_redu_data = cpl_image_get_data_float(
221 laplacian_redu_image));
222 check_nomsg( noise_image = cpl_image_new(nx,ny, CPL_TYPE_FLOAT));
223 check_nomsg( noise_data = cpl_image_get_data_float( noise_image));
224 check_nomsg( s_image = cpl_image_new(nx,ny, CPL_TYPE_FLOAT));
225 check_nomsg( s_data = cpl_image_get_data_float( s_image));
226 check_nomsg( s2_image = cpl_image_new(nx,ny, CPL_TYPE_FLOAT));
227 check_nomsg( s2_data = cpl_image_get_data_float( s2_image));
228 check_nomsg( f_image = cpl_image_new(nx,ny, CPL_TYPE_FLOAT));
229 check_nomsg( f_data = cpl_image_get_data_float( f_image));
230 check_nomsg( r_image = cpl_image_new(nx,ny, CPL_TYPE_FLOAT));
231 check_nomsg( r_data = cpl_image_get_data_float( r_image));
232 cosmic_data=cpl_calloc(nx*ny,
sizeof(
float));
235 while( new_crh > 0 && frac < crh_frac_max && nbiter <= max_iter ){
236 sinfo_msg(
"Iteration %d",nbiter );
243 for( j=0; j< ny; j++){
244 for( i=0; i< nx; i++){
245 float val = sci_data[i+j*nx];
247 if ( val < 0. ) val = 0. ;
248 two_sub_sample_data[i*2+j*2*two_sub_sample_nx] = val;
249 two_sub_sample_data[i*2+1+j*2*two_sub_sample_nx] = val;
250 two_sub_sample_data[i*2+(j*2+1)*two_sub_sample_nx] = val;
251 two_sub_sample_data[i*2+1+(j*2+1)*two_sub_sample_nx] = val;
259 laplacian_image = sinfo_image_filter_linear( two_sub_sample,
265 check_nomsg (laplacian_data = cpl_image_get_data_float( laplacian_image));
266 for ( i=0; i< two_sub_sample_nx*two_sub_sample_ny; i++){
267 if (laplacian_data[i] > 0.0){
268 laplacian_data[i] = 2.0 * laplacian_data[i];
271 laplacian_data[i] = 0.0;
275 cpl_image_save(laplacian_image,
"Lpositive.fits", CPL_BPP_IEEE_FLOAT, NULL,
286 for( j=0; j< ny; j++){
287 for( i=0; i< nx; i++){
288 laplacian_redu_data[i+j*nx] =
289 (laplacian_data[i*2+j*2*two_sub_sample_nx]+
290 laplacian_data[i*2+1+j*2*two_sub_sample_nx]+
291 laplacian_data[i*2+(j*2+1)*two_sub_sample_nx]+
292 laplacian_data[i*2+1+(j*2+1)*two_sub_sample_nx])/4.0;
296 cpl_image_save(laplacian_redu_image,
"Lplus.fits", CPL_BPP_IEEE_FLOAT,
297 NULL, CPL_IO_DEFAULT);
301 check_nomsg( sci_median5_image = sinfo_image_filter_median( sci_image,
303 check_nomsg (sci_median5_data = cpl_image_get_data_float( sci_median5_image));
307 for( i=0; i< nx*ny; i++){
308 noise_data[i] = sqrt(sci_median5_data[i]*gain+
314 for( i=0; i< nx*ny; i++){
315 s_data[i] = laplacian_redu_data[i] / (2.0*noise_data[i]);
320 check_nomsg( s_median_image = sinfo_image_filter_median( s_image,
322 check_nomsg( s_median_data = cpl_image_get_data_float( s_median_image));
326 for( i=0; i< nx*ny; i++){
327 s2_data[i] = s_data[i] -s_median_data[i];
330 cpl_image_save( s2_image,
"S2.fits", CPL_BPP_IEEE_FLOAT, NULL,
335 check_nomsg( sci_median3_image = sinfo_image_filter_median( sci_image,
340 check_nomsg( sci_median3_7_image = sinfo_image_filter_median( sci_median3_image,
343 check_nomsg ( sci_median3_data = cpl_image_get_data_float( sci_median3_image));
344 check_nomsg ( sci_median3_7_data = cpl_image_get_data_float(
345 sci_median3_7_image));
349 for( i=0; i< nx*ny; i++){
350 f_data[i] = sci_median3_data[i] -sci_median3_7_data[i];
351 if (f_data[i] < 0.01){
355 cpl_image_save( f_image,
"F.fits", CPL_BPP_IEEE_FLOAT, NULL,
360 for( i=0; i< nx*ny; i++){
361 r_data[i] = laplacian_redu_data[i]/f_data[i];
364 cpl_image_save( r_image,
"R.fits", CPL_BPP_IEEE_FLOAT, NULL,
371 median = cpl_vector_new(24);
373 for( j=1; j< ny-1; j++){
375 cpl_vector* med_vect = NULL;
377 for( i=1; i< nx-1; i++){
378 if ( (s2_data[i+j*nx] >= sigma_lim) &&
379 (r_data[i+j*nx] >= f_lim)){
381 cosmic_data[i+j*nx] = 1.0;
389 if (ui >= nx) ui = nx-1;
391 if (uj >= ny) uj = ny-1;
392 for( k=lj; k <= uj; k++){
393 for( l=li; l <= ui; l++){
396 cpl_vector_set(median, m, sci_data[l+k*nx]);
399 else if ( (k == j) && ( l < i)){
400 cpl_vector_set(median, m, sci_data[l+k*nx]);
403 else if ( l!=i && k!=j && (s2_data[l+k*nx] < sigma_lim)
404 && (r_data[l+k*nx] < f_lim)){
405 cpl_vector_set(median, m, sci_data[l+k*nx]);
410 check_nomsg( data = cpl_vector_get_data( median));
412 check_nomsg( med_vect = cpl_vector_wrap( m, data));
413 check_nomsg( sci_data[i+j*nx] = cpl_vector_get_median( med_vect));
414 cpl_vector_unwrap( med_vect);
418 sinfoni_free_vector( &median ) ;
420 frac = (double)nb_crh/(
double)(nx*ny) ;
421 sinfo_msg(
" new cosmics %d, total %d, frac %.4f [%d pixels]",new_crh,nb_crh,
424 sinfo_free_image( &laplacian_image);
425 sinfo_free_image( &sci_median3_7_image ) ;
426 sinfo_free_image( &sci_median3_image ) ;
427 sinfo_free_image( &s_median_image ) ;
428 sinfo_free_image( &sci_median5_image ) ;
433 debug = fopen(
"cosmic.log",
"w");
435 for( j=0; j< ny; j++){
436 for( i=0; i< nx; i++){
437 if ( cosmic_data[i+j*nx] == 1.0){
438 fprintf(debug,
"%.1f %.1f\n",i+1.0,j+1.0);
457 sinfoni_free_matrix( &laplacian_kernel);
458 sinfoni_free_matrix( &median3_kernel);
459 sinfoni_free_matrix( &median5_kernel);
460 sinfoni_free_matrix( &median7_kernel);
462 sinfo_free_image( &laplacian_image);
463 sinfo_free_image( &laplacian_redu_image);
464 sinfo_free_image( &two_sub_sample);
465 sinfo_free_image( &sci_median5_image);
466 sinfo_free_image( &noise_image);
467 sinfo_free_image( &s_image);
468 sinfo_free_image( &s_median_image);
469 sinfo_free_image( &s2_image);
470 sinfo_free_image( &sci_median3_image);
471 sinfo_free_image( &sci_median3_7_image);
472 sinfo_free_image( &f_image);
473 sinfo_free_image( &r_image);
475 sinfoni_free_vector( &median);
477 if(cosmic_data!=NULL) cpl_free( cosmic_data);