29#include "hdrl_maglim.h"
52hdrl_matrix_to_image_create(
const cpl_matrix * kernel,
53 const cpl_boolean normalise) {
55 cpl_ensure(kernel != NULL, CPL_ERROR_NULL_INPUT, NULL);
56 cpl_size sx = cpl_matrix_get_ncol(kernel);
57 cpl_size sy = cpl_matrix_get_nrow(kernel);
59 cpl_image* image = cpl_image_new(sx, sy, CPL_TYPE_DOUBLE);
60 double* pimage = cpl_image_get_data(image);
61 const double* pkernel = cpl_matrix_get_data_const(kernel);
63 for(cpl_size j = 0; j < sy; j++) {
65 for(cpl_size i = 0; i < sx; i++) {
67 pimage[pix] = pkernel[pix];
71 double sum = cpl_matrix_get_mean(kernel);
73 cpl_image_divide_scalar(image, sum);
83test_hdrl_extend_image(
void)
88 const cpl_size border_nx = 3;
89 const cpl_size border_ny = 5;
90 hdrl_image_extend_method extend_method = HDRL_IMAGE_EXTEND_NEAREST;
94 ima = cpl_image_new(nx, ny, CPL_TYPE_DOUBLE);
95 ima1 = cpl_image_new(nx, ny, CPL_TYPE_DOUBLE);
97 for(cpl_size i = 1; i <= nx; i++) {
98 cpl_image_fill_window(ima1, i, 1, i, ny, i-1);
100 cpl_image_add(ima,ima1);
103 for(cpl_size j = 1; j <= ny; j++) {
104 cpl_image_fill_window(ima1, 1, j, nx, j, (j-1) * 100);
107 cpl_image_add(ima,ima1);
109 cpl_image_delete(ima1);
113 extended = hdrl_extend_image(NULL, border_nx, border_ny, extend_method);
114 cpl_test_error(CPL_ERROR_NULL_INPUT);
115 cpl_test_null(extended);
117 extended = hdrl_extend_image(ima, -1, border_ny, extend_method);
118 cpl_test_error(CPL_ERROR_ILLEGAL_INPUT);
119 cpl_test_null(extended);
121 extended = hdrl_extend_image(ima, border_nx, -1, extend_method);
122 cpl_test_error(CPL_ERROR_ILLEGAL_INPUT);
123 cpl_test_null(extended);
125 extended = hdrl_extend_image(ima, border_nx, border_ny, 3);
126 cpl_test_error(CPL_ERROR_ILLEGAL_INPUT);
127 cpl_test_null(extended);
129 double* pext = cpl_image_get_data_double(ima);
130 for(cpl_size j = border_ny; j <= ny-border_ny; j++) {
131 for(cpl_size i = border_nx; i <= nx-border_nx; i++) {
132 cpl_test_abs(pext[j*nx+i], j*nx+i, HDRL_EPS_DATA);
135 extended = hdrl_extend_image(ima, border_nx, border_ny, extend_method);
136 cpl_test_error(CPL_ERROR_NONE);
137 cpl_test_nonnull(extended);
139 pext = cpl_image_get_data_double(extended);
140 pinp = cpl_image_get_data_double(ima);
144 cpl_size sx = cpl_image_get_size_x(extended);
145 cpl_size sy = cpl_image_get_size_y(extended);
147 for(cpl_size j = border_ny; j < sy-border_ny; j++) {
150 for(cpl_size i = 0; i < border_nx; i++) {
151 cpl_test_abs(pext[j*sx+i], pinp[(j-border_ny)*nx], HDRL_EPS_DATA);
154 for(cpl_size i = sx-border_nx; i < sx; i++) {
156 cpl_test_abs(pext[j*sx+i], pinp[(j-border_ny)*nx+(nx-1)], HDRL_EPS_DATA);
162 for(cpl_size j = 0; j < border_ny; j++) {
164 for(cpl_size i = border_nx; i < sx-border_nx; i++) {
165 cpl_test_abs(pext[j*sx+i], pinp[0*nx+i-border_nx], HDRL_EPS_DATA);
171 for(cpl_size j = sy - border_ny; j < sy; j++) {
174 for(cpl_size i = border_nx; i < sx-border_nx; i++) {
176 cpl_test_abs(pext[j*sx+i], pinp[(ny-1)*nx+i-border_nx], HDRL_EPS_DATA);
180 cpl_image_delete(extended);
181 cpl_image_delete(ima);
182 return cpl_error_get_code();
186test_hdrl_maglim_kernel_create(
void)
188 const cpl_size kernel_sx = 9;
189 const cpl_size kernel_sy = 9;
196 const double fwhm_seeing = sqrt(4*log(4));
197 cpl_matrix* kernel_mat;
198 kernel_mat = hdrl_maglim_kernel_create(-1, kernel_sy, fwhm_seeing);
199 cpl_test_error(CPL_ERROR_ILLEGAL_INPUT);
200 cpl_test_null(kernel_mat);
202 kernel_mat = hdrl_maglim_kernel_create(kernel_sx, -1, fwhm_seeing);
203 cpl_test_error(CPL_ERROR_ILLEGAL_INPUT);
204 cpl_test_null(kernel_mat);
206 kernel_mat = hdrl_maglim_kernel_create(kernel_sx, kernel_sy, -1);
207 cpl_test_error(CPL_ERROR_ILLEGAL_INPUT);
208 cpl_test_null(kernel_mat);
210 kernel_mat = hdrl_maglim_kernel_create(kernel_sx, kernel_sy, fwhm_seeing);
211 cpl_test_error(CPL_ERROR_NONE);
212 cpl_test_nonnull(kernel_mat);
216 for(cpl_size j = 0; j < kernel_sy; j++) {
217 y = j - 0.5 * (kernel_sy-1);
219 for(cpl_size i = 0; i < kernel_sx; i++) {
221 x = i - 0.5 * (kernel_sx-1);
222 arg = (x * x + y * y) / 2;
223 cpl_test_abs(cpl_matrix_get(kernel_mat,j,i), exp(-arg), HDRL_EPS_DATA);
229 kernel_ima = hdrl_matrix_to_image_create(kernel_mat, CPL_TRUE);
231 cpl_image_delete(kernel_ima);
233 cpl_matrix_delete(kernel_mat);
234 return cpl_error_get_code();
238test_util_crea_9x9_annular_image(
void) {
244 cpl_image* image = cpl_image_new(9, 9, CPL_TYPE_DOUBLE);
245 cpl_image_add_scalar(image, 60);
246 cpl_image_fill_window(image, 2, 2, 8, 8, 70);
247 cpl_image_fill_window(image, 3, 3, 7, 7, 80);
248 cpl_image_fill_window(image, 4, 4, 6, 6, 90);
249 cpl_image_fill_window(image, 5, 5, 5, 5, 100);
254test_hdrl_image_convolve(
void)
256 cpl_image * input_image ;
258 cpl_image * kernel_image;
259 hdrl_image_extend_method method = HDRL_IMAGE_EXTEND_MIRROR;
260 cpl_image* convolved;
261 const cpl_size kernel_sx = 9;
262 const cpl_size kernel_sy = 9;
263 const double fwhm_seeing = sqrt(4*log(4));
267 input_image = cpl_image_new(sx, sy, CPL_TYPE_DOUBLE);
268 cpl_image_add_scalar(input_image,1);
270 kernel = hdrl_maglim_kernel_create(kernel_sx, kernel_sy, fwhm_seeing);
271 kernel_image = hdrl_matrix_to_image_create(kernel, CPL_TRUE);
273 cpl_image_delete(kernel_image);
275 convolved = hdrl_image_convolve(NULL, kernel, method);
276 cpl_test_error(CPL_ERROR_NULL_INPUT);
277 cpl_test_null(convolved);
279 convolved = hdrl_image_convolve(input_image, NULL, method);
280 cpl_test_error(CPL_ERROR_NULL_INPUT);
281 cpl_test_null(convolved);
283 convolved = hdrl_image_convolve(input_image, kernel, 2);
284 cpl_test_error(CPL_ERROR_ILLEGAL_INPUT);
285 cpl_test_null(convolved);
288 convolved = hdrl_image_convolve(input_image, kernel, method);
290 cpl_test_error(CPL_ERROR_NONE);
291 cpl_test_nonnull(convolved);
292 cpl_image_delete(input_image);
293 cpl_matrix_delete(kernel);
294 cpl_image_delete(convolved);
300 input_image = test_util_crea_9x9_annular_image();
303 kernel = cpl_matrix_new(3, 3);
304 cpl_matrix_set(kernel, 1, 1, 1);
305 cpl_matrix_set(kernel, 1, 0, 0.7);
306 cpl_matrix_set(kernel, 0, 1, 0.7);
307 cpl_matrix_set(kernel, 2, 1, 0.7);
308 cpl_matrix_set(kernel, 1, 2, 0.7);
309 kernel_image = hdrl_matrix_to_image_create(kernel, CPL_FALSE);
311 cpl_image_delete(kernel_image);
313 convolved = hdrl_image_convolve(input_image, kernel, method);
319 cpl_test_abs(cpl_image_get(convolved, 5, 5, &status),92.63157894736842, HDRL_EPS_DATA);
320 cpl_test_abs(cpl_image_get(convolved, 4, 5, &status),90.0, HDRL_EPS_DATA);
321 cpl_test_abs(cpl_image_get(convolved, 3, 5, &status),80.0, HDRL_EPS_DATA);
322 cpl_test_abs(cpl_image_get(convolved, 2, 5, &status),70.0, HDRL_EPS_DATA);
323 cpl_test_abs(cpl_image_get(convolved, 1, 5, &status),61.8421052631579, HDRL_EPS_DATA);
324 cpl_test_abs(cpl_image_get(convolved, 1, 1, &status),60.0, HDRL_EPS_DATA);
325 cpl_test_abs(cpl_image_get(convolved, 2, 2, &status),66.31578947368422, HDRL_EPS_DATA);
326 cpl_test_abs(cpl_image_get(convolved, 3, 3, &status),76.31578947368422, HDRL_EPS_DATA);
327 cpl_test_abs(cpl_image_get(convolved, 4, 4, &status),86.31578947368422, HDRL_EPS_DATA);
328 cpl_image_delete(convolved);
329 cpl_image_delete(input_image);
330 cpl_matrix_delete(kernel);
331 return cpl_error_get_code();
335test_hdrl_matrix_to_image_create(
void)
339 const cpl_size kernel_sx = 9;
340 const cpl_size kernel_sy = 9;
341 const double fwhm_seeing = sqrt(4*log(4));
344 kernel = hdrl_maglim_kernel_create(kernel_sx, kernel_sy, fwhm_seeing);
346 image = hdrl_matrix_to_image_create(NULL, CPL_TRUE);
347 cpl_test_error(CPL_ERROR_NULL_INPUT);
348 cpl_test_null(image);
350 image = hdrl_matrix_to_image_create(kernel, CPL_TRUE);
351 cpl_test_nonnull(image);
353 cpl_test_abs(cpl_image_get_size_x(image), kernel_sx, HDRL_EPS_DATA);
354 cpl_test_abs(cpl_image_get_size_y(image), kernel_sy, HDRL_EPS_DATA);
356 cpl_image_delete(image);
357 cpl_matrix_delete(kernel);
358 return cpl_error_get_code();
362test_hdrl_maglim_compute(
void) {
364 double zeropoint = 0;
365 double fwhm_seeing = sqrt(4*log(4));;
366 const cpl_size kernel_sx = 9;
367 const cpl_size kernel_sy = 9;
368 double limiting_magnitude = 0;
370 hdrl_image_extend_method method = HDRL_IMAGE_EXTEND_MIRROR;
371 double histo_min = 0.;
372 double histo_max = 0.;
373 double bin_size = 0.;
374 cpl_size error_niter = 0;
375 hdrl_mode_type mode_method = HDRL_MODE_MEDIAN;
383 method, mode_parameter, &limiting_magnitude);
384 cpl_test_error(CPL_ERROR_NULL_INPUT);
386 image = test_util_crea_9x9_annular_image();
388 method, mode_parameter, &limiting_magnitude);
389 cpl_test_error(CPL_ERROR_ILLEGAL_INPUT);
393 method, mode_parameter, &limiting_magnitude);
394 cpl_test_error(CPL_ERROR_ILLEGAL_INPUT);
397 method, mode_parameter, &limiting_magnitude);
398 cpl_test_error(CPL_ERROR_ILLEGAL_INPUT);
402 -1, mode_parameter, &limiting_magnitude);
403 cpl_test_error(CPL_ERROR_ILLEGAL_INPUT);
406 method, NULL, &limiting_magnitude);
407 cpl_test_error(CPL_ERROR_INCOMPATIBLE_INPUT);
411 method, mode_parameter, &limiting_magnitude);
414 cpl_test_abs(limiting_magnitude,-5.591854160255954,HDRL_EPS_DATA);
417 cpl_image_delete(image);
419 return cpl_error_get_code();
430 cpl_test_init(PACKAGE_BUGREPORT, CPL_MSG_INFO);
432 test_hdrl_extend_image();
433 test_hdrl_maglim_kernel_create();
434 test_hdrl_image_convolve();
435 test_hdrl_matrix_to_image_create();
436 test_hdrl_maglim_compute();
438 return cpl_test_end(0);
hdrl_parameter * hdrl_collapse_mode_parameter_create(double histo_min, double histo_max, double bin_size, hdrl_mode_type mode_method, cpl_size error_niter)
create a parameter object for the mode
cpl_error_code hdrl_maglim_compute(const cpl_image *image, const double zeropoint, const double fwhm, const cpl_size kernel_size_x, const cpl_size kernel_size_y, const hdrl_image_extend_method image_extend_method, const hdrl_parameter *mode_parameter, double *limiting_magnitude)
Computes the limiting magnitude of an image.
void hdrl_parameter_delete(hdrl_parameter *obj)
shallow delete of a parameter