40 #include "omega_dfs.h"
41 #include "omega_stats.h"
42 #include "omega_utils.h"
43 #include "omega_bpm.h"
44 #include "omega_trim.h"
102 const char *_id =
"clean_deadpix_median";
104 cpl_binary *deaddata;
109 cpl_msg_error(_id,
"Null input image");
113 lx = cpl_image_get_size_x(dirty);
114 ly = cpl_image_get_size_y(dirty);
116 dirtydata = (
float *)cpl_image_get_data(dirty);
118 cleaned = cpl_image_new(lx,ly,CPL_TYPE_FLOAT);
119 cleandata = (
float *)cpl_image_get_data(cleaned);
121 goodpix = calloc((boxsize+1)*(boxsize+1),
sizeof(
float));
123 cpl_msg_error(_id,
"Error in allocating memory");
124 cpl_image_delete(cleaned);
130 deaddata = cpl_mask_get_data(dead);
137 if(deaddata[pixelpos] == CPL_BINARY_1){
138 cleandata[pixelpos] = dirtydata[pixelpos];
143 for(l=-boxsize; l<=boxsize; l++){
145 for(k=-boxsize; k<=boxsize; k++){
150 if((nx >= 0) && (nx < lx) &&
151 (ny >= 0) && (ny < ly) &&
152 (deaddata[nx+ny*lx] == CPL_BINARY_1)){
154 goodpix[numgood] = (double)dirtydata[nx+ny*lx];
161 cleandata[pixelpos] = (float)0;
165 cleandata[pixelpos] = get_median_float(goodpix, numgood);
191 cpl_mask *
makebpm(
const cpl_frame *hot,
const cpl_frame *cold,
int cxn)
198 if((hot == NULL) && (cold == NULL))
202 if((hot != NULL) && (cold != NULL)){
203 hot_img = cpl_image_load(cpl_frame_get_filename(hot), CPL_TYPE_INT, 0, cxn);
204 cold_img = cpl_image_load(cpl_frame_get_filename(cold), CPL_TYPE_INT, 0, cxn);
205 bpm = cpl_mask_threshold_image_create(hot_img, 0.5, 1.5) ;
206 mask = cpl_mask_threshold_image_create(cold_img, 0.5, 1.5) ;
208 cpl_mask_or(bpm, mask);
210 cpl_image_delete(hot_img);
211 cpl_image_delete(cold_img);
212 cpl_mask_delete(mask);
214 else if((hot == NULL) && (cold != NULL)){
215 cold_img = cpl_image_load(cpl_frame_get_filename(cold), CPL_TYPE_INT, 0, cxn);
216 bpm = cpl_mask_threshold_image_create(cold_img, 0.5, 1.5) ;
217 cpl_image_delete(cold_img);
219 else if((hot != NULL) && (cold == NULL)){
220 hot_img = cpl_image_load(cpl_frame_get_filename(hot), CPL_TYPE_INT, 0, cxn);
221 bpm = cpl_mask_threshold_image_create(hot_img, 0.5, 1.5) ;
222 cpl_image_delete(hot_img);
251 const char *alias = NULL;
258 if((frame == NULL) || (spars == NULL)){
259 cpl_msg_error(cpl_func,
"Input image or parameter list is NULL");
264 npars = cpl_parameterlist_get_size(spars);
265 par = cpl_parameterlist_get_first(spars);
267 for(i=0; i<npars; i++) {
268 alias = cpl_parameter_get_alias(par, CPL_PARAMETER_MODE_CLI);
269 if(strcmp (
"lt-satu", alias) == 0){
270 low = cpl_parameter_get_double(par);
272 else if(strcmp (
"ht-satu", alias) == 0){
273 high = cpl_parameter_get_double(par);
275 par = cpl_parameterlist_get_next(spars);
280 cpl_msg_error(cpl_func,
"Cannot trim image");
283 mask = cpl_mask_threshold_image_create(trim, low, high);
311 const char *alias = NULL;
318 if((trim == NULL) || (spars == NULL))
322 npars = cpl_parameterlist_get_size(spars);
323 par = cpl_parameterlist_get_first(spars);
325 for(i=0; i<npars; i++) {
326 alias = cpl_parameter_get_alias(par, CPL_PARAMETER_MODE_CLI);
327 if(strcmp (
"lt-satu", alias) == 0){
328 low = cpl_parameter_get_double(par);
330 else if(strcmp (
"ht-satu", alias) == 0){
331 high = cpl_parameter_get_double(par);
333 par = cpl_parameterlist_get_next(spars);
336 mask = cpl_mask_threshold_image_create(trim, low, high);
339 imsize=cpl_image_get_size_x(trim)*cpl_image_get_size_y(trim);
340 badpixel=cpl_mask_count(mask);
342 cpl_msg_debug(cpl_func,
"Ratio of saturated pixel: %g", badpixel/imsize);
344 cpl_msg_debug(cpl_func,
"Detected %g saturated pixels in image",badpixel);
346 if(badpixel/imsize > 0.95) {
347 cpl_msg_warning(cpl_func,
" %g percent of the pixels are saturated!",
348 badpixel/imsize*100.);
371 cpl_mask *cosmic,cpl_mask *satellite)
383 if((flat == NULL) || (bpmsatu == NULL)) {
384 cpl_msg_debug(cpl_func,
"NULL input frame");
389 bpm = cpl_mask_threshold_image_create(bpmsatu, 0.5, 1.5);
392 cpl_mask_or(bpm, cosmic);
394 if(satellite != NULL)
395 cpl_mask_or(bpm, satellite);
397 nx = cpl_mask_get_size_x(bpm);
398 ny = cpl_mask_get_size_y(bpm);
401 cpl_msg_debug(cpl_func,
"Weight of % " CPL_SIZE_FORMAT
" bad pixels is set to 0", cpl_mask_count(bpm));
408 mask_img = cpl_image_new_from_mask(bpm);
411 weight = cpl_image_cast(mask_img, CPL_TYPE_FLOAT);
415 cpl_image_multiply(weight, flat);
434 const char *name =
"omega_temp.fits";
435 const char *bname =
"omega_back.fits";
438 cpl_image *norm, *back;
445 par = cpl_parameterlist_get_first(pars);
447 for(i=0; i<cpl_parameterlist_get_size(pars); i++) {
448 text = cpl_parameter_get_alias(par, CPL_PARAMETER_MODE_CLI);
449 if(strcmp(
"low", text) == 0) {
450 low = cpl_parameter_get_double(par) ;
453 else if(strcmp(
"high", text) == 0){
454 high = cpl_parameter_get_double(par);
460 par = cpl_parameterlist_get_next(pars);
465 cpl_image_save(img, name, CPL_BPP_IEEE_FLOAT, NULL, CPL_IO_CREATE);
469 cpl_msg_warning(cpl_func,
"Error in creating background image");
473 if((back = cpl_image_load(bname, CPL_TYPE_FLOAT, 0, 0)) == NULL)
476 norm = cpl_image_divide_create(img, back);
479 bpm = cpl_mask_threshold_image_create(norm, low, high);