32 const double EPSILON = 1E-5;
33 int nx = cpl_image_get_size_x(b);
34 int ny = cpl_image_get_size_y(b);
35 int nrow = cpl_matrix_get_nrow(k);
36 int ncol = cpl_matrix_get_ncol(k);
38 cpl_type type = cpl_image_get_type(b);
39 cpl_image * a = cpl_image_new(
nx,
ny, type);
41 cpl_mask*
m = cpl_mask_new(ncol, nrow);
45 for (i = 0; i < ncol ; i++)
47 for (j = 0; j < nrow ; j++)
49 double value = cpl_matrix_get(k, j, i);
50 if (fabs(value - 1.0) < EPSILON)
52 cpl_mask_set(
m, i + 1, j + 1, CPL_BINARY_1);
57 cpl_image_filter_mask(a, b,
m,
mode, CPL_BORDER_FILTER);
64 const cpl_matrix * ker,
67 int nx = cpl_image_get_size_x(b);
68 int ny = cpl_image_get_size_y(b);
69 int type = cpl_image_get_type(b);
70 cpl_image * a = cpl_image_new(
nx,
ny, type);
73 case CPL_FILTER_MEDIAN:
74 check(cpl_image_filter(a, b, ker, CPL_FILTER_MEDIAN, CPL_BORDER_FILTER));
76 case CPL_FILTER_LINEAR:
77 check(cpl_image_filter(a, b, ker, CPL_FILTER_LINEAR, CPL_BORDER_FILTER));
79 case CPL_FILTER_STDEV:
80 cpl_image_filter(a, b, ker, CPL_FILTER_STDEV, CPL_BORDER_FILTER);
82 case CPL_FILTER_MORPHO:
83 cpl_image_filter(a, b, ker, CPL_FILTER_MORPHO, CPL_BORDER_FILTER);
126 typedef double* (*get_data)(cpl_bivector*);
127 get_data data_extractor[2] = { &cpl_bivector_get_x_data, &cpl_bivector_get_y_data};
133 cpl_vector * fitresidual = 0;
134 cpl_matrix * samppos2d = 0;
135 cpl_polynomial * fit2d = cpl_polynomial_new(2);
136 int xy_size = cpl_bivector_get_size(xy_pos);
138 samppos2d = cpl_matrix_new(2, xy_size);
139 for (i = 0; i < 2; i++)
141 for (j = 0; j < xy_size; j++)
143 double value = data_extractor[i](xy_pos)[j];
144 cpl_matrix_set(samppos2d, i, j, value);
148 cpl_polynomial_fit(fit2d, samppos2d, NULL, values, NULL, CPL_FALSE,
151 fitresidual = cpl_vector_new(xy_size);
152 cpl_vector_fill_polynomial_fit_residual(fitresidual, values, NULL, fit2d,
153 samppos2d, &rechisq);
156 *mse = cpl_vector_product(fitresidual, fitresidual)
157 / cpl_vector_get_size(fitresidual);
159 cpl_matrix_delete(samppos2d);
160 cpl_vector_delete(fitresidual);
166 const cpl_vector * x_pos,
167 const cpl_vector * values,
172 cpl_polynomial * fit1d = cpl_polynomial_new(1);
175 int x_size = cpl_vector_get_size(x_pos);
177 cpl_size loc_deg=(cpl_size)
degree;
178 cpl_matrix * samppos = cpl_matrix_wrap(1, x_size,
179 (
double*)cpl_vector_get_data_const(x_pos));
180 cpl_vector * fitresidual = cpl_vector_new(x_size);
182 cpl_polynomial_fit(fit1d, samppos, NULL, values, NULL,
183 CPL_FALSE, NULL, &loc_deg);
184 cpl_ensure(!cpl_error_get_code(), cpl_error_get_code(), NULL);
186 if ( x_size > (
degree + 1) ) {
187 cpl_vector_fill_polynomial_fit_residual(fitresidual, values, NULL, fit1d,
189 cpl_ensure(!cpl_error_get_code(), cpl_error_get_code(), NULL);
193 *mse = cpl_vector_product(fitresidual, fitresidual)
194 / cpl_vector_get_size(fitresidual);
196 cpl_matrix_unwrap(samppos);
197 cpl_vector_delete(fitresidual);
#define xsh_msg_error(...)
Print an error message.
cpl_polynomial * xsh_polynomial_fit_2d_create(cpl_bivector *xy_pos, cpl_vector *values, cpl_size *degree, double *mse)
cpl_image * xsh_image_filter_median(const cpl_image *img, const cpl_matrix *mx)
cpl_polynomial * xsh_polynomial_fit_1d_create(const cpl_vector *x_pos, const cpl_vector *values, int degree, double *mse)
static cpl_image * xsh_image_filter_wrapper(const cpl_image *b, const cpl_matrix *k, cpl_filter_mode mode)
cpl_image * xsh_image_filter_mode(const cpl_image *b, const cpl_matrix *ker, cpl_filter_mode filter)
cpl_image * xsh_image_filter_linear(const cpl_image *img, const cpl_matrix *mx)