28 #define TYPE_ADD(a) CONCAT2X(a, PIXEL_TYPE)
29 #define TYPE_ADD_CONST(a) CONCAT2X(a, CONCAT2X(PIXEL_TYPE, const))
50 TYPE_ADD(visir_destripe_find_max_index)(
const cpl_image *
self,
51 int per_stripe,
int n_per,
52 int dimy,
int off_min,
55 int * pmax_x,
int * pmax_y)
57 const PIXEL_TYPE * pimf = TYPE_ADD_CONST(cpl_image_get_data)(
self);
66 bug_if(cpl_image_get_type(
self) != PIXEL_TYPE_CPL);
67 bug_if(pmaximum == NULL);
68 bug_if(pindex == NULL);
69 bug_if(pmax_x == NULL);
70 bug_if(pmax_y == NULL);
73 bug_if(dimy < 2 * off_min);
78 for (i = 0; i < n_per; i++) {
80 for (istart = 0; istart < dimy - 2 * off_min; istart++) {
81 int istop = istart + off_min;
83 double ilen = (double)off_min;
87 for (j = istart; j < 1 + istop; j++)
88 sum_pix += pimf[i + j * per_stripe];
90 sum = sum_pix * sum_pix;
91 if (sum > maximum * ilen) {
98 for (istop++; istop < dimy - off_min; istop++) {
99 sum_pix += pimf[i + istop * per_stripe];
100 sum = sum_pix * sum_pix;
102 if (sum > maximum * ilen) {
103 maximum = sum / ilen;
117 cpl_msg_debug(cpl_func,
"Maximum image is image nb %d", 1 + *pindex);
118 cpl_msg_debug(cpl_func,
"Max x : %d Max y : %d", *pmax_x, *pmax_y);
122 return cpl_error_get_code();
139 static int TYPE_ADD(visir_destripe_image_one)(cpl_image *
self,
143 cpl_boolean do_horizontal)
147 const int per_stripe=16;
148 const int img_border = 2 + per_stripe;
149 const int dimx = cpl_image_get_size_y(
self);
150 const int dimy = cpl_image_get_size_x(
self);
151 cpl_image * bkgd = NULL;
152 cpl_image * imabc = NULL;
153 cpl_image * image_extract = NULL;
155 cpl_image * ima_med = NULL;
156 cpl_image * supp_total = NULL;
157 cpl_mask * supp_total_mask = NULL;
158 cpl_image * imf = NULL;
159 cpl_image * suppf = NULL;
163 cpl_image * stripes = NULL;
164 double maximum = 0.0;
170 cpl_vector * val_stripe = NULL;
171 cpl_mask * kernel = cpl_mask_new(29, 29);
172 cpl_mask * kernel3 = cpl_mask_new(3, 3);
177 bug_if(cpl_image_get_type(
self) != PIXEL_TYPE_CPL);
180 bkgd = TYPE_ADD(cpl_image_wrap)(dimy, dimx,
181 cpl_malloc(dimx*dimy*
sizeof(PIXEL_TYPE)));
183 bug_if(cpl_mask_not(kernel));
184 bug_if(cpl_image_filter_mask(bkgd,
self, kernel, CPL_FILTER_AVERAGE_FAST,
187 imabc = cpl_image_subtract_create(
self, bkgd);
188 cpl_image_delete(bkgd);
195 bug_if (cpl_image_turn(imabc, -1));
200 image_extract = cpl_image_extract(imabc, img_border, img_border,
201 dimx-img_border, dimy-img_border);
203 bug_if (image_extract == NULL);
205 noise = visir_image_sigma_clip(image_extract, &bgd);
208 cpl_image_delete(image_extract);
209 image_extract = NULL;
211 cpl_msg_debug(cpl_func,
"imabc noise = %g", noise);
212 cpl_msg_debug(cpl_func,
"imabc bgd = %g", bgd);
213 bug_if(cpl_image_subtract_scalar(imabc, bgd));
216 ima_med = TYPE_ADD(cpl_image_wrap)(dimy, dimx,
217 cpl_malloc(dimx*dimy*
sizeof(PIXEL_TYPE)));
218 bug_if(cpl_mask_not(kernel3));
219 bug_if(cpl_image_filter_mask(ima_med, imabc, kernel3, CPL_FILTER_MEDIAN,
223 bug_if (cpl_image_abs(ima_med));
224 supp_total_mask = cpl_mask_threshold_image_create(ima_med,
226 thres_detect * noise);
228 bug_if (supp_total_mask == NULL);
229 cpl_image_delete(ima_med);
231 cpl_msg_debug(cpl_func,
"Stripe mask = %d/%d [pixel]",
232 (
int)cpl_mask_count(supp_total_mask),
233 (
int)(cpl_mask_get_size_x(supp_total_mask)*
234 cpl_mask_get_size_y(supp_total_mask)));
236 supp_total = cpl_image_new_from_mask(supp_total_mask);
238 bug_if(cpl_image_save(supp_total,
"supp_total_1.fits", CPL_BPP_8_UNSIGNED,
239 NULL, CPL_IO_DEFAULT));
244 bug_if(visir_destripe_mask(supp_total_mask));
246 cpl_image_delete(supp_total);
247 supp_total = cpl_image_new_from_mask(supp_total_mask);
250 bug_if(cpl_image_save(supp_total,
"supp_total_2.fits",
251 CPL_BPP_8_UNSIGNED, NULL, CPL_IO_DEFAULT));
255 cpl_mask_delete(supp_total_mask);
256 supp_total_mask = NULL;
259 bug_if(cpl_image_multiply(imabc, supp_total));
260 bug_if(cpl_image_divide_scalar(imabc, noise));
264 imf = cpl_image_extract(imabc, 1, 1, per_stripe, dimy);
265 bug_if( imf == NULL);
267 suppf = cpl_image_extract(supp_total, 1, 1, per_stripe, dimy);
268 bug_if( suppf == NULL);
270 n_per=dimx/per_stripe;
271 for (i=1; i <n_per; i ++)
273 cpl_image * suppf_tmp;
274 cpl_image * imf_tmp =
275 cpl_image_extract(imabc, (per_stripe*i)+1, 1,
276 per_stripe*(i+1), dimy);
277 cpl_error_code error = cpl_image_add(imf, imf_tmp);
279 cpl_image_delete(imf_tmp);
283 suppf_tmp = cpl_image_extract(supp_total, (per_stripe*i)+1, 1,
284 per_stripe*(i+1), dimy);
285 error = cpl_image_add(suppf, suppf_tmp);
286 cpl_image_delete(suppf_tmp);
289 bug_if(cpl_image_divide_scalar(imf, n_per));
292 bug_if(cpl_image_threshold(suppf, -0.5*DBL_MAX, 1, 0, 1));
293 bug_if(cpl_image_multiply(imf, suppf));
294 cpl_image_delete(suppf);
297 bug_if (TYPE_ADD(visir_destripe_find_max_index)(imf, per_stripe, n_per, dimy,
298 off_min, &maximum, &indice,
300 cpl_image_delete(imf);
304 if (maximum < threshold) {
305 cpl_msg_info(cpl_func,
"No stripes found: maximum=%g < treshold=%g",
310 const int * psupp_total;
311 const PIXEL_TYPE * pimabc;
312 cpl_boolean is_ok = CPL_FALSE;
314 pimabc = TYPE_ADD_CONST(cpl_image_get_data)(imabc);
315 psupp_total = cpl_image_get_data_int_const(supp_total);
318 val_stripe = cpl_vector_new(n_per);
320 for (i=0; i < n_per; i++) {
323 for (j=max_x; j<max_y+1; j++)
325 ind = i*per_stripe+indice + j * dimx;
326 if (psupp_total[ind] == 1)
328 value += pimabc[ind];
336 #ifdef VISIR_DESTRIPE_AVERAGE
337 for (j=max_x; j<max_y+1; j++) {
338 pima[i*per_stripe+indice+j*dimx] = value;
341 cpl_vector_set(val_stripe, i, value);
345 #ifdef VISIR_DESTRIPE_AVERAGE
346 cpl_msg_info(cpl_func,
"Destriping: maximum=%g < treshold=%g",
350 bug_if(cpl_image_multiply_scalar(stripes, noise));
352 const double stripe_median = noise
353 * cpl_vector_get_median(val_stripe);
356 stripes = cpl_image_new(dimx, dimy, PIXEL_TYPE_CPL);
357 pima = TYPE_ADD(cpl_image_get_data)(stripes);
361 for (i=0; i<n_per; i++) {
362 for (j=max_x; j<max_y+1; j++) {
363 pima[i*per_stripe+indice+j*dimx] = stripe_median;
366 cpl_msg_info(cpl_func,
"Destriping: maximum=%g < treshold=%g. "
367 "value=%g @ %dX%d. (noise=%g)", maximum, threshold,
368 stripe_median, n_per, max_y+1-max_x, noise);
372 bug_if(cpl_image_turn(stripes, 1));
375 bug_if(cpl_image_subtract(
self, stripes));
378 cpl_msg_warning(cpl_func,
"Destriping found no stripes");
381 cpl_vector_delete(val_stripe);
389 cpl_mask_delete(kernel);
390 cpl_mask_delete(kernel3);
391 cpl_image_delete(imabc);
392 cpl_vector_delete(val_stripe);
393 cpl_image_delete(imf);
394 cpl_image_delete(suppf);
395 cpl_mask_delete(supp_total_mask);
396 cpl_image_delete(ima_med);
397 cpl_image_delete(image_extract);
398 cpl_image_delete(stripes);
399 cpl_image_delete(bkgd);
400 cpl_image_delete(supp_total);
402 return cpl_error_get_code() ? -1 : isdone;