28#include "hdrl_bpm_2d.h"
29#include "hdrl_bpm_2d.c"
30#include "hdrl_image.h"
41void test_parlist(
void)
44 hdrl_parameter * hpar;
47 hdrl_parameter * fil_def =
53 hdrl_parameter * leg_def =
67 cpl_test_error(CPL_ERROR_NULL_INPUT);
70 cpl_test_error(CPL_ERROR_NONE);
73 cpl_test_error(CPL_ERROR_NONE);
77 cpl_test_error(CPL_ERROR_ILLEGAL_INPUT);
81 cpl_test_error(CPL_ERROR_ILLEGAL_INPUT);
85 cpl_test_error(CPL_ERROR_ILLEGAL_INPUT);
89 cpl_test_error(CPL_ERROR_ILLEGAL_INPUT);
93 cpl_test_error(CPL_ERROR_ILLEGAL_INPUT);
97 cpl_test_error(CPL_ERROR_ILLEGAL_INPUT);
101 cpl_test_error(CPL_ERROR_ILLEGAL_INPUT);
105 cpl_test_error(CPL_ERROR_ILLEGAL_INPUT);
109 cpl_test_error(CPL_ERROR_ILLEGAL_INPUT);
113 cpl_test_error(CPL_ERROR_ILLEGAL_INPUT);
117 cpl_test_error(CPL_ERROR_ILLEGAL_INPUT);
121 cpl_test_error(CPL_ERROR_ILLEGAL_INPUT);
125 cpl_test_error(CPL_ERROR_ILLEGAL_INPUT);
129 cpl_test_error(CPL_ERROR_ILLEGAL_INPUT);
133 cpl_test_error(CPL_ERROR_ILLEGAL_INPUT);
137 cpl_test_error(CPL_ERROR_ILLEGAL_INPUT);
141 cpl_test_error(CPL_ERROR_ILLEGAL_INPUT);
146 cpl_parameterlist *plErr;
147 hdrl_parameter *parseErr;
151 plErr = hdrl_bpm_2d_filtersmooth_parameter_create_parlist(NULL,
"filter", fil_def);
152 cpl_test_error(CPL_ERROR_NULL_INPUT);
153 cpl_test_null(plErr);
155 plErr = hdrl_bpm_2d_filtersmooth_parameter_create_parlist(
"test", NULL, fil_def);
156 cpl_test_error(CPL_ERROR_NULL_INPUT);
157 cpl_test_null(plErr);
159 plErr = hdrl_bpm_2d_filtersmooth_parameter_create_parlist(
"test",
"filter", NULL);
160 cpl_test_error(CPL_ERROR_NULL_INPUT);
161 cpl_test_null(plErr);
163 plErr = hdrl_bpm_2d_filtersmooth_parameter_create_parlist(
"test",
"filter", fil_def);
164 cpl_test_error(CPL_ERROR_NONE);
165 cpl_test_nonnull(plErr);
168 cpl_test_error(CPL_ERROR_NULL_INPUT);
169 cpl_test_null(parseErr);
172 cpl_test_error(CPL_ERROR_NULL_INPUT);
173 cpl_test_null(parseErr);
176 cpl_test_error(CPL_ERROR_DATA_NOT_FOUND);
177 cpl_test_null(parseErr);
179 cpl_parameterlist_delete(plErr);
185 plErr = hdrl_bpm_2d_legendresmooth_parameter_create_parlist(NULL,
"legendre", leg_def);
186 cpl_test_error(CPL_ERROR_NULL_INPUT);
187 cpl_test_null(plErr);
189 plErr = hdrl_bpm_2d_legendresmooth_parameter_create_parlist(
"test", NULL, leg_def);
190 cpl_test_error(CPL_ERROR_NULL_INPUT);
191 cpl_test_null(plErr);
193 plErr = hdrl_bpm_2d_legendresmooth_parameter_create_parlist(
"test",
"legendre", NULL);
194 cpl_test_error(CPL_ERROR_NULL_INPUT);
195 cpl_test_null(plErr);
197 plErr = hdrl_bpm_2d_legendresmooth_parameter_create_parlist(
"test",
"legendre", leg_def);
198 cpl_test_error(CPL_ERROR_NONE);
199 cpl_test_nonnull(plErr);
202 cpl_test_error(CPL_ERROR_NULL_INPUT);
203 cpl_test_null(parseErr);
206 cpl_test_error(CPL_ERROR_NULL_INPUT);
207 cpl_test_null(parseErr);
210 cpl_test_error(CPL_ERROR_DATA_NOT_FOUND);
211 cpl_test_null(parseErr);
213 cpl_parameterlist_delete(plErr);
220 cpl_test_error(CPL_ERROR_NULL_INPUT);
221 cpl_test_null(plErr);
224 cpl_test_error(CPL_ERROR_NULL_INPUT);
225 cpl_test_null(plErr);
228 cpl_test_error(CPL_ERROR_NULL_INPUT);
229 cpl_test_null(plErr);
232 cpl_test_error(CPL_ERROR_NULL_INPUT);
233 cpl_test_null(plErr);
236 cpl_test_error(CPL_ERROR_NULL_INPUT);
237 cpl_test_null(plErr);
240 cpl_test_error(CPL_ERROR_NONE);
241 cpl_test_eq(cpl_parameterlist_get_size(pos), 17);
251 cpl_test_error(CPL_ERROR_DATA_NOT_FOUND);
254 cpl_parameterlist_delete(pos);
255 cpl_test_error(CPL_ERROR_NONE);
258 cpl_test_error(CPL_ERROR_NULL_INPUT);
260 cpl_test_error(CPL_ERROR_NONE);
263 cpl_test_error(CPL_ERROR_NULL_INPUT);
265 cpl_test_error(CPL_ERROR_NONE);
268 cpl_test_error(CPL_ERROR_NULL_INPUT);
270 cpl_test_error(CPL_ERROR_NONE);
273 cpl_test_error(CPL_ERROR_NULL_INPUT);
275 cpl_test_error(CPL_ERROR_NONE);
278 cpl_test_error(CPL_ERROR_NULL_INPUT);
280 cpl_test_error(CPL_ERROR_NONE);
283 cpl_test_error(CPL_ERROR_NULL_INPUT);
285 cpl_test_error(CPL_ERROR_NONE);
288 cpl_test_error(CPL_ERROR_NULL_INPUT);
290 cpl_test_error(CPL_ERROR_NONE);
294 cpl_test_error(CPL_ERROR_NULL_INPUT);
296 cpl_test_error(CPL_ERROR_NONE);
299 cpl_test_error(CPL_ERROR_NULL_INPUT);
301 cpl_test_error(CPL_ERROR_NONE);
304 cpl_test_error(CPL_ERROR_NULL_INPUT);
306 cpl_test_error(CPL_ERROR_NONE);
309 cpl_test_error(CPL_ERROR_NULL_INPUT);
311 cpl_test_error(CPL_ERROR_NONE);
314 cpl_test_error(CPL_ERROR_NULL_INPUT);
316 cpl_test_error(CPL_ERROR_NONE);
319 cpl_test_error(CPL_ERROR_NULL_INPUT);
321 cpl_test_error(CPL_ERROR_NONE);
326 "RECIPE",
"bpm",
"LEGENDRE", fil_def, leg_def);
327 cpl_test_error(CPL_ERROR_NONE);
330 cpl_parameterlist_delete(pos);
331 cpl_test_error(CPL_ERROR_NONE);
349 cpl_test_error(CPL_ERROR_NULL_INPUT);
351 cpl_test_error(CPL_ERROR_NONE);
356 cpl_test(!strcmp(filter_to_string(CPL_FILTER_EROSION),
"EROSION"));
357 cpl_test(!strcmp(filter_to_string(CPL_FILTER_DILATION),
"DILATION"));
358 cpl_test(!strcmp(filter_to_string(CPL_FILTER_OPENING),
"OPENING"));
359 cpl_test(!strcmp(filter_to_string(CPL_FILTER_CLOSING),
"CLOSING"));
360 cpl_test(!strcmp(filter_to_string(CPL_FILTER_LINEAR),
"LINEAR"));
361 cpl_test(!strcmp(filter_to_string(CPL_FILTER_LINEAR_SCALE),
"LINEAR_SCALE"));
362 cpl_test(!strcmp(filter_to_string(CPL_FILTER_AVERAGE),
"AVERAGE"));
363 cpl_test(!strcmp(filter_to_string(CPL_FILTER_AVERAGE_FAST),
"AVERAGE_FAST"));
364 cpl_test(!strcmp(filter_to_string(CPL_FILTER_MEDIAN),
"MEDIAN"));
365 cpl_test(!strcmp(filter_to_string(CPL_FILTER_STDEV),
"STDEV"));
366 cpl_test(!strcmp(filter_to_string(CPL_FILTER_STDEV_FAST),
"STDEV_FAST"));
367 cpl_test(!strcmp(filter_to_string(CPL_FILTER_MORPHO),
"MORPHO"));
368 cpl_test(!strcmp(filter_to_string(CPL_FILTER_MORPHO_SCALE),
"MORPHO_SCALE"));
370 cpl_test(!strcmp(border_to_string(CPL_BORDER_FILTER),
"FILTER"));
371 cpl_test(!strcmp(border_to_string(CPL_BORDER_ZERO),
"ZERO"));
372 cpl_test(!strcmp(border_to_string(CPL_BORDER_CROP),
"CROP"));
373 cpl_test(!strcmp(border_to_string(CPL_BORDER_NOP),
"NOP"));
374 cpl_test(!strcmp(border_to_string(CPL_BORDER_COPY),
"COPY"));
387static cpl_error_code hdrl_bpm_2d_test_compute(
void)
389 cpl_image * data = NULL;
390 cpl_image * errors = NULL;
391 cpl_mask * mask_out = NULL;
392 hdrl_parameter * bpm_param;
396 CPL_FILTER_MEDIAN, CPL_BORDER_FILTER, 3, 3) ;
401 double values[] = {92, 93, 94, 94, 95, 95, 96, 96, 96, 97,
402 97, 97, 97, 98, 98, 98, 98, 99, 99, 99,
403 99, 100, 100, 100, 100, 100, 101, 101, 101, 101,
404 102, 102, 102, 102, 103, 103, 103, 103, 104, 104,
405 104, 105, 105, 106, 106, 107, 108, 500, 600 };
407 data = cpl_image_wrap(7, 7, CPL_TYPE_DOUBLE, values);
408 errors = cpl_image_new(7, 7, CPL_TYPE_DOUBLE);
409 cpl_image_add_scalar(errors, 1);
411 cpl_image_set(errors, 7, 7, 100000.);
412 cpl_image_set(errors, 6, 7, 10000.);
417 cpl_test_error(CPL_ERROR_NULL_INPUT);
418 cpl_test_null(mask_out);
421 cpl_test_error(CPL_ERROR_NULL_INPUT);
422 cpl_test_null(mask_out);
426 cpl_test_error(CPL_ERROR_NONE);
427 cpl_test_nonnull(mask_out);
429 cpl_mask_delete(mask_out);
433 2, 20, 20, 11, 11, 3, 3);
441 cpl_mask_delete(mask_out);
442 cpl_image_unwrap(data);
443 cpl_image_delete(errors);
448 cpl_mask * data_bpm = cpl_mask_new(200, 300);
449 data = cpl_image_new(200, 300, CPL_TYPE_FLOAT);
451 cpl_image_fill_noise_uniform(data, 90, 110);
452 cpl_image_set(data, 50, 50, 300.);
453 cpl_image_set(data, 100, 100, 300.);
454 cpl_image_set(data, 150, 150, 300.);
455 cpl_image_set(data, 110, 260, 300.);
457 cpl_mask_set(data_bpm, 120,120, CPL_BINARY_1);
458 cpl_mask_set(data_bpm, 120,121, CPL_BINARY_1);
459 cpl_mask_set(data_bpm, 120,122, CPL_BINARY_1);
460 cpl_mask_set(data_bpm, 121,120, CPL_BINARY_1);
461 cpl_mask_set(data_bpm, 121,121, CPL_BINARY_1);
462 cpl_mask_set(data_bpm, 121,122, CPL_BINARY_1);
463 cpl_mask_set(data_bpm, 122,120, CPL_BINARY_1);
464 cpl_mask_set(data_bpm, 122,121, CPL_BINARY_1);
465 cpl_mask_set(data_bpm, 122,122, CPL_BINARY_1);
467 cpl_image_set(data, 122, 122, 300.);
469 cpl_image_reject_from_mask(data, data_bpm);
471 errors=cpl_image_power_create(data, 0.5);
477 CPL_FILTER_MEDIAN, CPL_BORDER_FILTER, 3, 3) ;
480 cpl_test_eq(cpl_mask_get(mask_out, 50, 50), CPL_BINARY_1);
481 cpl_test_eq(cpl_mask_get(mask_out, 100, 100), CPL_BINARY_1);
482 cpl_test_eq(cpl_mask_get(mask_out, 150, 150), CPL_BINARY_1);
483 cpl_test_eq(cpl_mask_get(mask_out, 110, 260), CPL_BINARY_1);
484 cpl_test_eq(cpl_mask_get(mask_out, 122, 122), CPL_BINARY_0);
485 cpl_mask_delete(mask_out);
489 5, 20, 20, 11, 11, 3, 3);
492 cpl_test_eq(cpl_mask_get(mask_out, 50, 50), CPL_BINARY_1);
493 cpl_test_eq(cpl_mask_get(mask_out, 100, 100), CPL_BINARY_1);
494 cpl_test_eq(cpl_mask_get(mask_out, 150, 150), CPL_BINARY_1);
495 cpl_test_eq(cpl_mask_get(mask_out, 110, 260), CPL_BINARY_1);
496 cpl_test_eq(cpl_mask_get(mask_out, 122, 122), CPL_BINARY_0);
498 cpl_mask_delete(data_bpm);
499 cpl_mask_delete(mask_out);
500 cpl_image_delete(data);
501 cpl_image_delete(errors);
505 return cpl_error_get_code();
515 cpl_test_init(PACKAGE_BUGREPORT, CPL_MSG_WARNING);
516 hdrl_bpm_2d_test_compute();
518 cpl_test_error(CPL_ERROR_NONE);
519 return cpl_test_end(0);
cpl_mask * hdrl_bpm_2d_compute(const hdrl_image *img_in, const hdrl_parameter *params)
Detect bad pixels on a single image with an iterative process.
hdrl_bpm_2d_method hdrl_bpm_2d_parameter_get_method(const hdrl_parameter *p)
Access the method in the BPM_2D parameter.
double hdrl_bpm_2d_parameter_get_kappa_high(const hdrl_parameter *p)
Access the kappa_high in the BPM_2D parameter.
int hdrl_bpm_2d_parameter_get_maxiter(const hdrl_parameter *p)
Access the maxiter in the BPM_2D parameter.
cpl_border_mode hdrl_bpm_2d_parameter_get_border(const hdrl_parameter *p)
Access the border in the BPM_2D parameter.
int hdrl_bpm_2d_parameter_get_filter_size_y(const hdrl_parameter *p)
Access the filter_size_y in the BPM_2D parameter.
int hdrl_bpm_2d_parameter_get_smooth_y(const hdrl_parameter *p)
Access the smooth_y in the BPM_2D parameter.
int hdrl_bpm_2d_parameter_get_order_y(const hdrl_parameter *p)
Access the order_y in the BPM_2D parameter.
hdrl_parameter * hdrl_bpm_2d_parameter_parse_parlist(const cpl_parameterlist *parlist, const char *prefix)
Parse parameter list to create input parameters for the BPM_2D.
int hdrl_bpm_2d_parameter_get_filter_size_x(const hdrl_parameter *p)
Access the filter_size_x in the BPM_2D parameter.
hdrl_parameter * hdrl_bpm_2d_parameter_create_filtersmooth(double kappa_low, double kappa_high, int maxiter, cpl_filter_mode filter, cpl_border_mode border, int smooth_x, int smooth_y)
Creates BPM_2D Parameters object for HDRL_BPM_2D_FILTERSMOOTH.
int hdrl_bpm_2d_parameter_get_smooth_x(const hdrl_parameter *p)
Access the smooth_x in the BPM_2D parameter.
int hdrl_bpm_2d_parameter_get_steps_x(const hdrl_parameter *p)
Access the steps_x in the BPM_2D parameter.
cpl_filter_mode hdrl_bpm_2d_parameter_get_filter(const hdrl_parameter *p)
Access the filter in the BPM_2D parameter.
cpl_error_code hdrl_bpm_2d_parameter_verify(const hdrl_parameter *param)
Verify basic correctness of the BPM_2D parameters.
cpl_parameterlist * hdrl_bpm_2d_parameter_create_parlist(const char *base_context, const char *prefix, const char *method_def, const hdrl_parameter *filtersmooth_def, const hdrl_parameter *legendresmooth_def)
Create parameter list for the BPM_2D computation.
int hdrl_bpm_2d_parameter_get_order_x(const hdrl_parameter *p)
Access the order_x in the BPM_2D parameter.
int hdrl_bpm_2d_parameter_get_steps_y(const hdrl_parameter *p)
Access the steps_y in the BPM_2D parameter.
hdrl_parameter * hdrl_bpm_2d_parameter_create_legendresmooth(double kappa_low, double kappa_high, int maxiter, int steps_x, int steps_y, int filter_size_x, int filter_size_y, int order_x, int order_y)
Creates BPM_2D Parameters object for HDRL_BPM_2D_LEGENDRESMOOTH.
cpl_boolean hdrl_bpm_2d_parameter_check(const hdrl_parameter *self)
Check that the parameter is a BPM_2D parameter.
double hdrl_bpm_2d_parameter_get_kappa_low(const hdrl_parameter *p)
Access the kappa_low in the BPM_2D parameter.
hdrl_image * hdrl_image_create(const cpl_image *image, const cpl_image *error)
create a new hdrl_image from to existing images by copying them
void hdrl_image_delete(hdrl_image *himg)
delete hdrl_image
void hdrl_parameter_delete(hdrl_parameter *obj)
shallow delete of a parameter