42 #include "omega_bpm.h"
44 #include "omega_utils.h"
96 cpl_image *lowpass_image;
99 lowpass_image = cpl_image_new (xs, ys, CPL_TYPE_FLOAT);
100 if (lowpass_image == NULL) {
101 cpl_msg_error (cpl_func,
"Cannot generate lowpass filter <%s>",cpl_error_get_message());
108 data = cpl_image_get_data_float(lowpass_image);
120 data[0] = (float)1.0;
123 for (i=1 ; i<=hlx ; i++) {
124 x = (double)i / sigma_x;
125 gaussval = (double)exp(-0.5*x*x);
127 data[xs-i] = gaussval;
130 for (j=1; j<=hly ; j++) {
131 y = (double)j / sigma_y;
133 data[j*xs] = (double)exp(-0.5*y*y);
134 data[(ys-j)*xs] = (
double)exp(-0.5*y*y);
136 for (i=1 ; i<=hlx ; i++) {
138 x = (double) i / sigma_x;
139 gaussval = (double)exp (-0.5*(x*x+y*y));
140 data[j*xs+i] = gaussval;
141 data[(j+1)*xs-i] = gaussval;
142 data[(ys-j)*xs+i] = gaussval;
143 data[(ys+1-j)*xs-i] = gaussval;
155 return lowpass_image;
172 double gausfilt,
int mirrorx,
int mirrory){
174 int xsize=0, ysize=0;
179 cpl_image *clean_flat=NULL;
180 cpl_image *eflat=NULL;
181 cpl_image *eflat_complex=NULL;
182 cpl_image *eflat_real=NULL;
184 cpl_image *filter_image=NULL;
185 cpl_image *filter_image_complex=NULL;
186 cpl_image *flat_real;
190 clean_flat = cpl_image_duplicate(flat);
192 cpl_image_reject_from_mask(clean_flat,bpm);
193 cpl_detector_interpolate_rejected(clean_flat);
199 freeimage(clean_flat);
200 cpl_msg_error(cpl_func,
"Filter image is NULL");
204 freeimage(clean_flat);
206 xsize = cpl_image_get_size_x(eflat);
207 ysize = cpl_image_get_size_y(eflat);
210 sigma_y = (double)(sigma_x * ysize) / xsize;
215 if(filter_image == NULL){
216 cpl_msg_error(cpl_func,
"Filter image is NULL");
220 eflat_complex = cpl_image_new(xsize,ysize, CPL_TYPE_FLOAT_COMPLEX);
221 eflat_real = cpl_image_new(xsize,ysize, CPL_TYPE_FLOAT);
222 filter_image_complex =cpl_image_cast(filter_image,CPL_TYPE_FLOAT_COMPLEX);
225 cpl_image_delete(filter_image);
229 cpl_fft_image(eflat_complex, eflat, CPL_FFT_FORWARD);
231 cpl_image_delete(eflat);
234 cpl_image_multiply(eflat_complex,filter_image_complex);
238 cpl_fft_image(eflat_real, eflat_complex,CPL_FFT_BACKWARD);
240 cpl_image_delete(eflat_complex);
241 cpl_image_delete(filter_image_complex);
244 flat_real = cpl_image_extract(eflat_real, mirrorx+1, mirrory+1,
245 xsize-mirrorx, ysize-mirrory);
247 if (flat_real == NULL) {
248 cpl_msg_error (cpl_func,
"Real extracted image is NULL. <%s>", cpl_error_get_message());
251 cpl_image_delete(eflat_real);
282 cpl_image *big_image;
286 xs = cpl_image_get_size_x(image);
287 ys = cpl_image_get_size_y(image);
292 data = cpl_image_get_data_float(image);
294 big_image = cpl_image_new(xx, yy, CPL_TYPE_FLOAT);
295 out_data = cpl_image_get_data_float(big_image);
297 for (j=0; j<ys ; j++){
301 for (i=0; i<xs ; i++){
302 out_data[outrow+dx+i] = data[inrow+i];
305 for (i=0; i<dx; i++){
306 out_data[outrow+i] = data[inrow+dx-i-1];
307 out_data[outrow+xs+dx+i] = data[inrow+xs-i-1];
312 for (j=0; j<dy ; j++) {
314 for (i=0; i<xx; i++) {
315 out_data[j*xx+i] = out_data[(2*dy-j-1)*xx+i];
316 out_data[(yy-j-1)*xx+i] = out_data[(yy-2*dy+j)*xx+i];