32 #include <fors_stack.h>
35 #include <fors_utils.h>
57 const char *default_method)
60 const char *full_name = NULL;
63 name =
"stack_method";
64 full_name = cpl_sprintf(
"%s.%s", context, name);
65 p = cpl_parameter_new_enum(full_name,
67 "Frames combination method",
70 "average",
"median",
"minmax",
"ksigma");
71 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, name);
72 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
73 cpl_parameterlist_append(parameters, p);
74 cpl_free((
void *)full_name);
78 name =
"minrejection";
79 full_name = cpl_sprintf(
"%s.%s", context, name);
80 p = cpl_parameter_new_value(full_name,
82 "Number of lowest values to be rejected",
85 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, name);
86 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
87 cpl_parameterlist_append(parameters, p);
88 cpl_free((
void *)full_name);
90 name =
"maxrejection";
91 full_name = cpl_sprintf(
"%s.%s", context, name);
92 p = cpl_parameter_new_value(full_name,
94 "Number of highest values to be rejected",
97 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, name);
98 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
99 cpl_parameterlist_append(parameters, p);
100 cpl_free((
void *)full_name);
104 full_name = cpl_sprintf(
"%s.%s", context, name);
105 p = cpl_parameter_new_value(full_name,
107 "Low threshold in ksigma method",
110 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, name);
111 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
112 cpl_parameterlist_append(parameters, p);
113 cpl_free((
void *)full_name);
116 full_name = cpl_sprintf(
"%s.%s", context, name);
117 p = cpl_parameter_new_value(full_name,
119 "High threshold in ksigma method",
122 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, name);
123 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
124 cpl_parameterlist_append(parameters, p);
125 cpl_free((
void *)full_name);
128 full_name = cpl_sprintf(
"%s.%s", context, name);
129 p = cpl_parameter_new_value(full_name,
131 "Max number of iterations in ksigma method",
134 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, name);
135 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
136 cpl_parameterlist_append(parameters, p);
137 cpl_free((
void *)full_name);
145 cpl_free((void *)name); \
159 stack_method *sm = cpl_malloc(
sizeof(stack_method));
160 const char *name = NULL;
162 cpl_msg_info(cpl_func,
"Stack method parameters:");
164 cpl_msg_indent_more();
165 name = cpl_sprintf(
"%s.%s", context,
"stack_method");
168 cpl_free((
void *)name); name = NULL;
169 cpl_msg_indent_less();
171 assure( !cpl_error_get_code(),
return NULL, NULL );
172 assure( sm->method_name != NULL,
return NULL, NULL );
174 if (strcmp(sm->method_name,
"average") == 0) {
175 sm->method = AVERAGE;
177 else if (strcmp(sm->method_name,
"mean") == 0) {
180 else if (strcmp(sm->method_name,
"wmean") == 0) {
183 else if (strcmp(sm->method_name,
"median") == 0) {
186 else if (strcmp(sm->method_name,
"minmax") == 0) {
192 else if (strcmp(sm->method_name,
"ksigma") == 0) {
196 assure(
false,
return NULL,
"Unknown stack method '%s'", sm->method_name);
199 switch (sm->method) {
206 cpl_msg_indent_more();
207 cpl_msg_indent_more();
208 name = cpl_sprintf(
"%s.%s", context,
"minrejection");
211 cpl_free((
void *)name); name = NULL;
212 cpl_msg_indent_less();
213 cpl_msg_indent_less();
214 assure( !cpl_error_get_code(),
return NULL, NULL );
216 cpl_msg_indent_more();
217 cpl_msg_indent_more();
218 name = cpl_sprintf(
"%s.%s", context,
"maxrejection");
221 cpl_free((
void *)name); name = NULL;
222 cpl_msg_indent_less();
223 cpl_msg_indent_less();
224 assure( !cpl_error_get_code(),
return NULL, NULL );
228 cpl_msg_indent_more();
229 cpl_msg_indent_more();
230 name = cpl_sprintf(
"%s.%s", context,
"klow");
233 cpl_free((
void *)name); name = NULL;
234 cpl_msg_indent_less();
235 cpl_msg_indent_less();
236 assure( !cpl_error_get_code(),
return NULL, NULL );
238 cpl_msg_indent_more();
239 cpl_msg_indent_more();
240 name = cpl_sprintf(
"%s.%s", context,
"khigh");
243 cpl_free((
void *)name); name = NULL;
244 cpl_msg_indent_less();
245 cpl_msg_indent_less();
246 assure( !cpl_error_get_code(),
return NULL, NULL );
248 cpl_msg_indent_more();
249 cpl_msg_indent_more();
250 name = cpl_sprintf(
"%s.%s", context,
"kiter");
253 cpl_free((
void *)name); name = NULL;
254 cpl_msg_indent_less();
255 cpl_msg_indent_less();
256 assure( !cpl_error_get_code(),
return NULL, NULL );
260 passure(
false,
return NULL );
276 cpl_free(*sm); *sm = NULL;
290 assure( sm != NULL,
return "Null", NULL );
292 return sm->method_name;
310 assure( images != NULL,
return master, NULL );
311 assure( fors_image_list_size(images) > 0,
return master,
312 "No images to collapse");
314 cpl_msg_info(cpl_func,
"Stacking images (method = %s)",
317 switch (sm->method) {
326 sm->pars.minmax.min_reject,
327 sm->pars.minmax.max_reject);
335 sm->pars.ksigma.klow,
336 sm->pars.ksigma.khigh,
337 sm->pars.ksigma.kiter);
340 assure(
false,
return NULL,
"Unknown stack method '%s' (%d)",
fors_image * fors_image_collapse_create(const fors_image_list *images)
Average collapse.
const char * fors_stack_method_get_string(const stack_method *sm)
Stack method as string.
fors_image * fors_image_collapse_ksigma_create(const fors_image_list *images, int low, int high, int iter)
Ksigma collapse.
int dfs_get_parameter_int_const(const cpl_parameterlist *parlist, const char *name)
void fors_stack_define_parameters(cpl_parameterlist *parameters, const char *context, const char *default_method)
Define recipe parameters.
fors_image * fors_image_collapse_median_create(const fors_image_list *images)
Median collapse.
void fors_stack_method_delete(stack_method **sm)
Destructor.
stack_method * fors_stack_method_new(const cpl_parameterlist *parameters, const char *context)
Get stack method from parameter list.
const char * dfs_get_parameter_string_const(const cpl_parameterlist *parlist, const char *name)
fors_image * fors_stack(fors_image_list *images, const stack_method *sm)
Same as fors_stack_const()
fors_image * fors_stack_const(const fors_image_list *images, const stack_method *sm)
Stack images.
fors_image * fors_image_collapse_minmax_create(const fors_image_list *images, int low, int high)
Minmax collapse.
double dfs_get_parameter_double_const(const cpl_parameterlist *parlist, const char *name)