28#include "hdrl_bpm_utils.h"
29#include "hdrl_image.h"
46static cpl_error_code hdrl_bpm_test_bpm_to_mask(
void)
52 cpl_test_error(CPL_ERROR_NULL_INPUT);
57 cpl_image * bpm = cpl_image_new(nx, ny, CPL_TYPE_DOUBLE);
59 cpl_test_error(CPL_ERROR_ILLEGAL_INPUT);
61 cpl_image_delete(bpm);
64 bpm = cpl_image_new(nx, ny, CPL_TYPE_INT);
67 cpl_test_error(CPL_ERROR_UNSUPPORTED_MODE);
69 cpl_image_delete(bpm);
73 cpl_image * bpm = cpl_image_new(nx, ny, CPL_TYPE_INT);
75 cpl_test_nonnull(mask);
76 cpl_test_eq(cpl_mask_count(mask), 0);
77 cpl_image_delete(bpm);
78 cpl_mask_delete(mask);
82 cpl_image * bpm = cpl_image_new(nx, ny, CPL_TYPE_INT);
83 cpl_image_set(bpm, 1, 1, 1);
84 cpl_image_set(bpm, 1, 2, 2);
85 cpl_image_set(bpm, 1, 3, 3);
86 cpl_image_set(bpm, 1, 4, 4);
91 cpl_test_nonnull(mask);
92 cpl_test_eq(cpl_mask_count(mask), 2);
93 cpl_mask_delete(mask);
96 cpl_test_error(CPL_ERROR_NONE);
97 cpl_test_nonnull(mask);
98 cpl_test_eq(cpl_mask_count(mask), 4);
99 cpl_mask_delete(mask);
101 cpl_image_delete(bpm);
103 return cpl_error_get_code();
112static cpl_error_code hdrl_bpm_test_mask_to_bpm(
void)
118 cpl_test_error(CPL_ERROR_NULL_INPUT);
124 cpl_mask * mask = cpl_mask_new(nx, ny);
126 cpl_test_nonnull(bpm);
127 cpl_test_eq(cpl_image_get_flux(bpm), 0);
128 cpl_image_delete(bpm);
129 cpl_mask_delete(mask);
133 cpl_mask * mask = cpl_mask_new(nx, ny);
134 cpl_mask_set(mask, 1, 1, CPL_BINARY_1);
135 cpl_mask_set(mask, 1, 2, CPL_BINARY_1);
136 cpl_mask_set(mask, 1, 3, CPL_BINARY_1);
137 cpl_mask_set(mask, 1, 4, CPL_BINARY_1);
142 cpl_test_nonnull(bpm);
143 cpl_test_eq(cpl_image_get_flux(bpm), 4);
144 cpl_image_delete(bpm);
147 cpl_test_nonnull(bpm);
148 cpl_test_eq(cpl_image_get_flux(bpm), 5 * 4);
149 cpl_image_delete(bpm);
151 cpl_mask_delete(mask);
153 return cpl_error_get_code();
162static cpl_error_code hdrl_bpm_test_hdrl_bpm_filter(
void)
164 cpl_mask *img_mask = cpl_mask_new(200, 300);
166 cpl_mask_set(img_mask, 50, 50, CPL_BINARY_1);
167 cpl_mask_set(img_mask, 100, 100, CPL_BINARY_1);
168 cpl_mask_set(img_mask, 150, 150, CPL_BINARY_1);
169 cpl_mask_set(img_mask, 100, 250, CPL_BINARY_1);
170 cpl_mask_set(img_mask, 100, 252, CPL_BINARY_1);
171 cpl_mask_set(img_mask, 100, 254, CPL_BINARY_1);
172 cpl_mask_set(img_mask, 100, 256, CPL_BINARY_1);
173 cpl_mask_set(img_mask, 102, 252, CPL_BINARY_1);
174 cpl_mask_set(img_mask, 102, 254, CPL_BINARY_1);
175 cpl_mask_set(img_mask, 102, 256, CPL_BINARY_1);
176 cpl_mask_set(img_mask, 198, 252, CPL_BINARY_1);
177 cpl_mask_set(img_mask, 198, 254, CPL_BINARY_1);
178 cpl_mask_set(img_mask, 198, 256, CPL_BINARY_1);
179 cpl_mask_set(img_mask, 200, 252, CPL_BINARY_1);
180 cpl_mask_set(img_mask, 200, 254, CPL_BINARY_1);
181 cpl_mask_set(img_mask, 200, 256, CPL_BINARY_1);
182 cpl_mask_set(img_mask, 199, 300, CPL_BINARY_1);
183 cpl_mask_set(img_mask, 199, 299, CPL_BINARY_1);
184 cpl_mask_set(img_mask, 199, 298, CPL_BINARY_1);
185 cpl_mask_set(img_mask, 200, 300, CPL_BINARY_1);
186 cpl_mask_set(img_mask, 200, 299, CPL_BINARY_1);
187 cpl_mask_set(img_mask, 200, 298, CPL_BINARY_1);
189 cpl_mask_set(img_mask, 199, 200, CPL_BINARY_1);
190 cpl_mask_set(img_mask, 199, 198, CPL_BINARY_1);
196 cpl_mask *filtered_mask =
hdrl_bpm_filter(img_mask, 3, 3, CPL_FILTER_CLOSING);
198 cpl_test_eq(cpl_mask_get(filtered_mask, 100, 255), CPL_BINARY_1);
199 cpl_test_eq(cpl_mask_get(filtered_mask, 101, 255), CPL_BINARY_1);
200 cpl_test_eq(cpl_mask_get(filtered_mask, 102, 255), CPL_BINARY_1);
201 cpl_test_eq(cpl_mask_get(filtered_mask, 103, 255), CPL_BINARY_0);
203 cpl_test_eq(cpl_mask_get(filtered_mask, 100, 251), CPL_BINARY_1);
205 cpl_test_eq(cpl_mask_get(filtered_mask, 198, 255), CPL_BINARY_1);
206 cpl_test_eq(cpl_mask_get(filtered_mask, 199, 255), CPL_BINARY_1);
207 cpl_test_eq(cpl_mask_get(filtered_mask, 200, 255), CPL_BINARY_1);
209 cpl_test_eq(cpl_mask_get(filtered_mask, 198, 254), CPL_BINARY_1);
210 cpl_test_eq(cpl_mask_get(filtered_mask, 199, 254), CPL_BINARY_1);
211 cpl_test_eq(cpl_mask_get(filtered_mask, 200, 254), CPL_BINARY_1);
214 cpl_test_eq(cpl_mask_get(filtered_mask, 200, 199), CPL_BINARY_0);
218 cpl_mask_delete(filtered_mask);
222 cpl_mask_delete(img_mask);
224 return cpl_error_get_code();
234static cpl_error_code hdrl_bpm_test_bpmgrow(
void)
236 const char* img_mask_name =
"img_mask.fits";
237 const char* filtered_morpho_mask_name =
"filtered_morpho_mask.fits";
238 const char* filtered_average_mask_name =
"filtered_average_mask.fits";
239 const char* file_gauss_name =
"gauss.fits";
240 const char* filtered_gauss_data_name =
"filtered_gauss_data.fits";
241 const char* filtered_gauss_mask_name =
"filtered_gauss_mask.fits";
244 cpl_mask *img_mask = cpl_mask_new(200, 300);
246 cpl_mask_set(img_mask, 50, 50, CPL_BINARY_1);
247 cpl_mask_set(img_mask, 100, 100, CPL_BINARY_1);
248 cpl_mask_set(img_mask, 150, 150, CPL_BINARY_1);
249 cpl_mask_set(img_mask, 100, 250, CPL_BINARY_1);
250 cpl_mask_set(img_mask, 100, 252, CPL_BINARY_1);
251 cpl_mask_set(img_mask, 100, 254, CPL_BINARY_1);
252 cpl_mask_set(img_mask, 100, 256, CPL_BINARY_1);
253 cpl_mask_set(img_mask, 102, 252, CPL_BINARY_1);
254 cpl_mask_set(img_mask, 102, 254, CPL_BINARY_1);
255 cpl_mask_set(img_mask, 102, 256, CPL_BINARY_1);
256 cpl_mask_set(img_mask, 198, 252, CPL_BINARY_1);
257 cpl_mask_set(img_mask, 198, 254, CPL_BINARY_1);
258 cpl_mask_set(img_mask, 198, 256, CPL_BINARY_1);
259 cpl_mask_set(img_mask, 200, 252, CPL_BINARY_1);
260 cpl_mask_set(img_mask, 200, 254, CPL_BINARY_1);
261 cpl_mask_set(img_mask, 200, 256, CPL_BINARY_1);
262 cpl_mask_set(img_mask, 199, 300, CPL_BINARY_1);
263 cpl_mask_set(img_mask, 199, 299, CPL_BINARY_1);
264 cpl_mask_set(img_mask, 199, 298, CPL_BINARY_1);
265 cpl_mask_set(img_mask, 200, 300, CPL_BINARY_1);
266 cpl_mask_set(img_mask, 200, 299, CPL_BINARY_1);
267 cpl_mask_set(img_mask, 200, 298, CPL_BINARY_1);
269 cpl_mask_save(img_mask,
"img_mask.fits", NULL, CPL_IO_CREATE);
276 cpl_matrix * kernel = cpl_matrix_new(3, 3);
277 cpl_matrix_fill(kernel, 1.0);
278 cpl_image * result_data = cpl_image_new_from_mask(img_mask);
280 cpl_image * filtered_data = cpl_image_new(
281 cpl_image_get_size_x(result_data),
282 cpl_image_get_size_y(result_data),
285 cpl_image_filter(filtered_data, result_data, kernel,
286 CPL_FILTER_MORPHO_SCALE, CPL_BORDER_FILTER);
289 cpl_mask * filtered_mask = cpl_mask_threshold_image_create(
290 filtered_data, 3.-0.5, DBL_MAX);
292 cpl_mask_save(filtered_mask, filtered_morpho_mask_name, NULL,
295 cpl_mask_delete(filtered_mask);
296 cpl_image_delete(result_data);
297 cpl_image_delete(filtered_data);
298 cpl_matrix_delete(kernel);
315 cpl_mask * kernel = cpl_mask_new(3, 3);
316 cpl_mask_not(kernel);
319 cpl_image * result_data = cpl_image_new_from_mask(img_mask);
321 cpl_image * filtered_data = cpl_image_new(
322 cpl_image_get_size_x(result_data),
323 cpl_image_get_size_y(result_data),
328 cpl_image_filter_mask(filtered_data, result_data, kernel,
329 CPL_FILTER_AVERAGE_FAST, CPL_BORDER_FILTER);
333 cpl_mask * filtered_mask = cpl_mask_threshold_image_create(
334 filtered_data, (3.-0.5)/(3.*3.), DBL_MAX);
337 cpl_mask_save(filtered_mask, filtered_average_mask_name, NULL, CPL_IO_CREATE);
339 cpl_mask_delete(filtered_mask);
340 cpl_image_delete(result_data);
341 cpl_image_delete(filtered_data);
342 cpl_mask_delete(kernel);
359 cpl_image * gauss = cpl_image_new(2 * n + 1, 2 * n + 1, CPL_TYPE_DOUBLE);
361 cpl_image_fill_gaussian(gauss, n + 1, n + 1, (
double)121.0, sig_x, sig_y);
364 cpl_matrix * kernel = cpl_matrix_wrap(2 * n + 1, 2 * n + 1,
365 cpl_image_get_data_double(gauss));
372 cpl_image * result_data = cpl_image_new_from_mask(img_mask);
374 cpl_image * filtered_data = cpl_image_new(
375 cpl_image_get_size_x(result_data),
376 cpl_image_get_size_y(result_data),
379 cpl_image_filter(filtered_data, result_data, kernel,
380 CPL_FILTER_LINEAR, CPL_BORDER_FILTER);
383 cpl_mask * filtered_mask = cpl_mask_threshold_image_create(
384 filtered_data, 3.-0.5, DBL_MAX);
386 cpl_image_save(filtered_data, filtered_gauss_data_name,
387 CPL_TYPE_DOUBLE, NULL, CPL_IO_CREATE);
388 cpl_image_save(gauss, file_gauss_name,
389 CPL_TYPE_DOUBLE, NULL, CPL_IO_CREATE);
391 cpl_mask_save(filtered_mask, filtered_gauss_mask_name, NULL, CPL_IO_CREATE);
393 cpl_matrix_unwrap(kernel);
394 cpl_image_delete(gauss);
395 cpl_mask_delete(filtered_mask);
396 cpl_image_delete(result_data);
397 cpl_image_delete(filtered_data);
401 cpl_mask_delete(img_mask);
404 remove(img_mask_name);
405 remove(filtered_morpho_mask_name);
406 remove(filtered_average_mask_name);
407 remove(file_gauss_name);
408 remove(filtered_gauss_data_name);
409 remove(filtered_gauss_mask_name);
411 return cpl_error_get_code();
421static cpl_error_code hdrl_bpm_test_apply_masks_to_imagelist(
void)
430 cpl_image *img = cpl_image_fill_test_create(nx, ny);
431 cpl_imagelist *list = cpl_imagelist_new();
432 for (cpl_size i=0; i < NUM_IMAGES; i++) {
433 cpl_imagelist_set(list, cpl_image_duplicate(img), i);
435 cpl_image_delete(img);
439 cpl_mask *new_mask = cpl_mask_new(nx, ny);
440 cpl_mask **orig_masks;
442 cpl_mask_delete(new_mask);
450 cpl_imagelist_delete(list);
451 for (cpl_size i = 0; i < NUM_IMAGES; i++) {
452 cpl_mask_delete(orig_masks[i]);
454 cpl_free(orig_masks);
456 return CPL_ERROR_NONE;
467 cpl_test_init(PACKAGE_BUGREPORT, CPL_MSG_WARNING);
469 hdrl_bpm_test_bpm_to_mask();
470 hdrl_bpm_test_mask_to_bpm();
471 hdrl_bpm_test_hdrl_bpm_filter();
472 hdrl_bpm_test_bpmgrow() ;
473 hdrl_bpm_test_apply_masks_to_imagelist();
475 cpl_test_error(CPL_ERROR_NONE);
477 return cpl_test_end(0);
cpl_image * hdrl_mask_to_bpm(const cpl_mask *mask, uint64_t flag)
convert cpl_mask to bad pixel information mask
cpl_mask * hdrl_bpm_to_mask(const cpl_image *bpm, uint64_t selection)
convert bad pixel information mask to a cpl_mask
cpl_mask * hdrl_bpm_filter(const cpl_mask *input_mask, cpl_size kernel_nx, cpl_size kernel_ny, cpl_filter_mode filter)
Allows the growing and shrinking of bad pixel masks. It can be used to e.g. set pixels to bad if the ...
cpl_error_code hdrl_join_mask_on_imagelist(cpl_imagelist *list, cpl_mask *new_mask, cpl_mask ***pold_mask)
join mask with existing masks in an imagelist
cpl_error_code hdrl_set_masks_on_imagelist(cpl_imagelist *list, cpl_mask **masks)
apply array of masks to an image list