CR2RE Pipeline Reference Manual 1.6.2
hdrl_bpm_3d-test.c
1/*
2 * This file is part of the HDRL
3 * Copyright (C) 2013,2014 European Southern Observatory
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18 */
19
20#ifdef HAVE_CONFIG_H
21#include <config.h>
22#endif
23
24/*-----------------------------------------------------------------------------
25 Includes
26 -----------------------------------------------------------------------------*/
27
28#include "hdrl_bpm_3d.h"
29#include "hdrl_image.h"
30
31#include <cpl.h>
32#include <math.h>
33#include <string.h>
34
35/*----------------------------------------------------------------------------*/
39/*----------------------------------------------------------------------------*/
40
41void test_parlist(void)
42{
43 /* parameter parsing smoketest */
44 hdrl_parameter * hpar;
45 hdrl_parameter * deflts;
46
47 deflts = hdrl_bpm_3d_parameter_create(4, 5, HDRL_BPM_3D_THRESHOLD_ERROR);
48 cpl_parameterlist *pos = hdrl_bpm_3d_parameter_create_parlist(
49 "RECIPE", "bpm", deflts);
50 hdrl_parameter *parse = hdrl_bpm_3d_parameter_parse_parlist(pos, "RECIPE.bpm");
51 cpl_test_error(CPL_ERROR_NONE);
52 cpl_test_nonnull(parse);
55 cpl_parameterlist_delete(pos);
56
57 deflts = hdrl_bpm_3d_parameter_create(4, 5, HDRL_BPM_3D_THRESHOLD_RELATIVE);
58 pos = hdrl_bpm_3d_parameter_create_parlist("RECIPE", "bpm", deflts);
59 hdrl_parameter_delete(deflts) ;
60 cpl_test_error(CPL_ERROR_NONE);
61 cpl_test_eq(cpl_parameterlist_get_size(pos), 3);
62
63 hpar = hdrl_bpm_3d_parameter_parse_parlist(pos, "RECIPE.invalid");
64 cpl_test_null(hpar);
65 cpl_test_error(CPL_ERROR_DATA_NOT_FOUND);
66
67 hpar = hdrl_bpm_3d_parameter_parse_parlist(pos, "RECIPE.bpm");
68 cpl_parameterlist_delete(pos);
69 cpl_test_error(CPL_ERROR_NONE);
70
71 cpl_test_eq(hdrl_bpm_3d_parameter_get_method(hpar),
72 HDRL_BPM_3D_THRESHOLD_RELATIVE);
73 cpl_test_eq(hdrl_bpm_3d_parameter_get_kappa_low(hpar), 4);
74 cpl_test_eq(hdrl_bpm_3d_parameter_get_kappa_high(hpar), 5);
76}
77
78/*----------------------------------------------------------------------------*/
83/*----------------------------------------------------------------------------*/
84static cpl_error_code hdrl_bpm_3d_test_compute(void)
85{
86 cpl_image * img_tmp = NULL;
87 cpl_imagelist * result_data = NULL;
88 hdrl_imagelist * imglist = hdrl_imagelist_new();
89 int bad = 0;
90 hdrl_parameter * bpm_param ;
91 for (int var = 0; var <5 ; ++var) {
92 cpl_image * data = cpl_image_new(200, 300, CPL_TYPE_DOUBLE);
93 cpl_mask * data_bpm = cpl_mask_new(200, 300);
94 /* STDEV is about 10 for these images */
95 cpl_image_fill_noise_uniform(data, 82, 118);
96 if(var == 0) {
97 /* Negative outlier set and marked as bad */
98 cpl_image_set(data, 10, 10, 20.);
99 cpl_mask_set(data_bpm, 10, 10, CPL_BINARY_1);
100
101 /* Positive outlier set and marked as bad */
102 cpl_image_set(data, 50, 50, 300.);
103 cpl_mask_set(data_bpm, 50, 50, CPL_BINARY_1);
104
105 /* Positive outliers set */
106 cpl_image_set(data, 60, 60, 300.);
107 cpl_image_set(data, 61, 61, 300.);
108 cpl_image_set(data, 62, 62, 300.);
109
110 /* Negative outliers set */
111 cpl_image_set(data, 70, 70, 20.);
112 cpl_image_set(data, 71, 71, 20.);
113 cpl_image_set(data, 72, 72, 20.);
114
115 /*Some pixels marked as bad*/
116 cpl_mask_set(data_bpm, 80, 80, CPL_BINARY_1);
117 cpl_mask_set(data_bpm, 81, 80, CPL_BINARY_1);
118 cpl_mask_set(data_bpm, 82, 80, CPL_BINARY_1);
119
120 } else if (var == 3) {
121 cpl_image_set(data, 150, 150, 300.);
122 cpl_image_set(data, 110, 260, 300.);
123 cpl_mask_set(data_bpm, 70, 70, CPL_BINARY_1);
124 cpl_mask_set(data_bpm, 80, 80, CPL_BINARY_1);
125 }
126
127 cpl_image_reject_from_mask(data, data_bpm);
128 cpl_image * errors=cpl_image_power_create(data, 0.5);
129 hdrl_image * image = hdrl_image_create(data, errors);
130
131 hdrl_imagelist_set(imglist, image, var);
132 /* free the memory */
133 cpl_mask_delete(data_bpm);
134 cpl_image_delete(data);
135 cpl_image_delete(errors);
136
137 }
138 //----------------------------------------------------------------------
139 bpm_param = hdrl_bpm_3d_parameter_create(-50.0, 50.0,
140 HDRL_BPM_3D_THRESHOLD_ABSOLUTE) ;
141 cpl_test(hdrl_bpm_3d_parameter_check(bpm_param));
142
143 result_data = hdrl_bpm_3d_compute(imglist, bpm_param);
144 hdrl_parameter_delete(bpm_param) ;
145 img_tmp = cpl_imagelist_get(result_data, 0);
146 cpl_test_eq(cpl_image_get(img_tmp, 10, 10, &bad), 0);
147 cpl_test_eq(cpl_image_get(img_tmp, 50, 50, &bad), 0);
148 cpl_test_eq(cpl_image_get(img_tmp, 60, 60, &bad), 1);
149 cpl_test_eq(cpl_image_get(img_tmp, 61, 61, &bad), 1);
150 cpl_test_eq(cpl_image_get(img_tmp, 62, 62, &bad), 1);
151 cpl_test_eq(cpl_image_get(img_tmp, 70, 70, &bad), 1);
152 cpl_test_eq(cpl_image_get(img_tmp, 71, 71, &bad), 1);
153 cpl_test_eq(cpl_image_get(img_tmp, 72, 72, &bad), 1);
154 cpl_test_eq(cpl_image_get(img_tmp, 80, 80, &bad), 0);
155 cpl_test_eq(cpl_image_get(img_tmp, 81, 80, &bad), 0);
156 cpl_test_eq(cpl_image_get(img_tmp, 82, 80, &bad), 0);
157 cpl_imagelist_delete(result_data);
158 //----------------------------------------------------------------------
159
160 //----------------------------------------------------------------------
161 bpm_param = hdrl_bpm_3d_parameter_create(5., 5.,
162 HDRL_BPM_3D_THRESHOLD_RELATIVE) ;
163 result_data = hdrl_bpm_3d_compute(imglist, bpm_param);
164 hdrl_parameter_delete(bpm_param) ;
165 img_tmp = cpl_imagelist_get(result_data, 0);
166 cpl_test_eq(cpl_image_get(img_tmp, 10, 10, &bad), 0);
167 cpl_test_eq(cpl_image_get(img_tmp, 50, 50, &bad), 0);
168 cpl_test_eq(cpl_image_get(img_tmp, 60, 60, &bad), 1);
169 cpl_test_eq(cpl_image_get(img_tmp, 61, 61, &bad), 1);
170 cpl_test_eq(cpl_image_get(img_tmp, 62, 62, &bad), 1);
171 cpl_test_eq(cpl_image_get(img_tmp, 70, 70, &bad), 1);
172 cpl_test_eq(cpl_image_get(img_tmp, 71, 71, &bad), 1);
173 cpl_test_eq(cpl_image_get(img_tmp, 72, 72, &bad), 1);
174 cpl_test_eq(cpl_image_get(img_tmp, 80, 80, &bad), 0);
175 cpl_test_eq(cpl_image_get(img_tmp, 81, 80, &bad), 0);
176 cpl_test_eq(cpl_image_get(img_tmp, 82, 80, &bad), 0);
177 cpl_imagelist_delete(result_data);
178 //----------------------------------------------------------------------
179
180 //----------------------------------------------------------------------
181 bpm_param = hdrl_bpm_3d_parameter_create(5., 5.,
182 HDRL_BPM_3D_THRESHOLD_ERROR) ;
183 result_data = hdrl_bpm_3d_compute(imglist, bpm_param);
184 hdrl_parameter_delete(bpm_param) ;
185 cpl_test_error(CPL_ERROR_NONE);
186
187 img_tmp = cpl_imagelist_get(result_data, 0);
188
189 cpl_test_eq(cpl_image_get(img_tmp, 10, 10, &bad), 0);
190 cpl_test_eq(cpl_image_get(img_tmp, 50, 50, &bad), 0);
191 cpl_test_eq(cpl_image_get(img_tmp, 60, 60, &bad), 1);
192 cpl_test_eq(cpl_image_get(img_tmp, 61, 61, &bad), 1);
193 cpl_test_eq(cpl_image_get(img_tmp, 62, 62, &bad), 1);
194 cpl_test_eq(cpl_image_get(img_tmp, 70, 70, &bad), 1);
195 cpl_test_eq(cpl_image_get(img_tmp, 71, 71, &bad), 1);
196 cpl_test_eq(cpl_image_get(img_tmp, 72, 72, &bad), 1);
197 cpl_test_eq(cpl_image_get(img_tmp, 80, 80, &bad), 0);
198 cpl_test_eq(cpl_image_get(img_tmp, 81, 80, &bad), 0);
199 cpl_test_eq(cpl_image_get(img_tmp, 82, 80, &bad), 0);
200 /*cpl_imagelist_save(result_data, "result.fits", CPL_TYPE_INT, NULL,
201 CPL_IO_CREATE);*/
202 cpl_imagelist_delete(result_data);
203 //----------------------------------------------------------------------
204
205 //----------------------------------------------------------------------
206 bpm_param = hdrl_bpm_3d_parameter_create(500., 5.,
207 HDRL_BPM_3D_THRESHOLD_ERROR) ;
208 result_data = hdrl_bpm_3d_compute(imglist, bpm_param);
209 hdrl_parameter_delete(bpm_param) ;
210 cpl_test_error(CPL_ERROR_NONE);
211
212 img_tmp = cpl_imagelist_get(result_data, 0);
213
214 cpl_test_eq(cpl_image_get(img_tmp, 10, 10, &bad), 0);
215 cpl_test_eq(cpl_image_get(img_tmp, 50, 50, &bad), 0);
216 cpl_test_eq(cpl_image_get(img_tmp, 60, 60, &bad), 1);
217 cpl_test_eq(cpl_image_get(img_tmp, 61, 61, &bad), 1);
218 cpl_test_eq(cpl_image_get(img_tmp, 62, 62, &bad), 1);
219 cpl_test_eq(cpl_image_get(img_tmp, 70, 70, &bad), 0);
220 cpl_test_eq(cpl_image_get(img_tmp, 71, 71, &bad), 0);
221 cpl_test_eq(cpl_image_get(img_tmp, 72, 72, &bad), 0);
222 cpl_test_eq(cpl_image_get(img_tmp, 80, 80, &bad), 0);
223 cpl_test_eq(cpl_image_get(img_tmp, 81, 80, &bad), 0);
224 cpl_test_eq(cpl_image_get(img_tmp, 82, 80, &bad), 0);
225 cpl_imagelist_delete(result_data);
226 //----------------------------------------------------------------------
227
228 bpm_param = hdrl_bpm_3d_parameter_create(5., 5.,
229 HDRL_BPM_3D_THRESHOLD_ERROR) ;
230 result_data = hdrl_bpm_3d_compute(NULL, bpm_param);
231 hdrl_parameter_delete(bpm_param) ;
232 cpl_test_null(result_data);
233 cpl_test_error(CPL_ERROR_NULL_INPUT);
234 bpm_param = hdrl_bpm_3d_parameter_create(5.1, 5.,
235 HDRL_BPM_3D_THRESHOLD_ABSOLUTE) ;
236 result_data = hdrl_bpm_3d_compute(imglist, bpm_param);
237 hdrl_parameter_delete(bpm_param) ;
238 cpl_test_null(result_data);
239 cpl_test_error(CPL_ERROR_ILLEGAL_INPUT);
240 bpm_param = hdrl_bpm_3d_parameter_create(-5., 5.,
241 HDRL_BPM_3D_THRESHOLD_RELATIVE) ;
242 result_data = hdrl_bpm_3d_compute(imglist, bpm_param);
243 hdrl_parameter_delete(bpm_param) ;
244 cpl_test_null(result_data);
245 cpl_test_error(CPL_ERROR_ILLEGAL_INPUT);
246 bpm_param = hdrl_bpm_3d_parameter_create(-5., 5.,
247 HDRL_BPM_3D_THRESHOLD_ERROR) ;
248 result_data = hdrl_bpm_3d_compute(imglist, bpm_param);
249 cpl_test_null(result_data);
250 hdrl_parameter_delete(bpm_param) ;
251 cpl_test_error(CPL_ERROR_ILLEGAL_INPUT);
252 bpm_param = hdrl_bpm_3d_parameter_create(5., -5.,
253 HDRL_BPM_3D_THRESHOLD_ERROR) ;
254 result_data = hdrl_bpm_3d_compute(imglist, bpm_param);
255 hdrl_parameter_delete(bpm_param) ;
256 cpl_test_null(result_data);
257 cpl_test_error(CPL_ERROR_ILLEGAL_INPUT);
258
259 hdrl_imagelist_delete(imglist);
260
261 return cpl_error_get_code();
262}
263
264
265/*----------------------------------------------------------------------------*/
269/*----------------------------------------------------------------------------*/
270int main(void)
271{
272 cpl_test_init(PACKAGE_BUGREPORT, CPL_MSG_WARNING);
273 hdrl_bpm_3d_test_compute();
274 test_parlist();
275 cpl_test_error(CPL_ERROR_NONE);
276 return cpl_test_end(0);
277}
double hdrl_bpm_3d_parameter_get_kappa_high(const hdrl_parameter *p)
Access the kappa_high in the BPM_3D parameter.
Definition: hdrl_bpm_3d.c:196
double hdrl_bpm_3d_parameter_get_kappa_low(const hdrl_parameter *p)
Access the kappa_low in the BPM_3D parameter.
Definition: hdrl_bpm_3d.c:182
cpl_parameterlist * hdrl_bpm_3d_parameter_create_parlist(const char *base_context, const char *prefix, const hdrl_parameter *defaults)
Create a parameter list for the BPM_3D computation.
Definition: hdrl_bpm_3d.c:231
cpl_imagelist * hdrl_bpm_3d_compute(const hdrl_imagelist *imglist, const hdrl_parameter *params)
detect bad pixels on a stack of identical images
Definition: hdrl_bpm_3d.c:409
hdrl_parameter * hdrl_bpm_3d_parameter_parse_parlist(const cpl_parameterlist *parlist, const char *prefix)
Parse a parameterlist to create input parameters for the BPM_3D.
Definition: hdrl_bpm_3d.c:314
hdrl_bpm_3d_method hdrl_bpm_3d_parameter_get_method(const hdrl_parameter *p)
Access the method in the BPM_3D parameter.
Definition: hdrl_bpm_3d.c:210
hdrl_parameter * hdrl_bpm_3d_parameter_create(double kappa_low, double kappa_high, hdrl_bpm_3d_method method)
Creates BPM Parameters object for the imagelist method.
Definition: hdrl_bpm_3d.c:108
cpl_boolean hdrl_bpm_3d_parameter_check(const hdrl_parameter *self)
Check that the parameter is a BPM_3D parameter.
Definition: hdrl_bpm_3d.c:170
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
Definition: hdrl_image.c:295
cpl_error_code hdrl_imagelist_set(hdrl_imagelist *himlist, hdrl_image *himg, cpl_size pos)
Insert an image into an imagelist.
void hdrl_imagelist_delete(hdrl_imagelist *himlist)
Free all memory used by a hdrl_imagelist object including the images.
hdrl_imagelist * hdrl_imagelist_new(void)
Create an empty imagelist.
void hdrl_parameter_delete(hdrl_parameter *obj)
shallow delete of a parameter