39#include "irplib_oddeven.h"
45static cpl_imagelist *irplib_oddeven_cube_conv_xy_rtheta(cpl_imagelist *);
46static cpl_imagelist *irplib_oddeven_cube_conv_rtheta_xy(cpl_imagelist *);
71 int llx, lly, urx, ury;
74 cpl_apertures *aperts;
78 if (in == NULL || r_even == NULL)
80 nx = cpl_image_get_size_x(in);
81 ny = cpl_image_get_size_y(in);
115 cpl_msg_error(cpl_func,
"Unsupported mode");
121 if ((extracted = cpl_image_extract(in, llx, lly, urx, ury)) == NULL) {
122 cpl_msg_error(cpl_func,
"Cannot extract quadrant");
126 nx = cpl_image_get_size_x(extracted);
127 ny = cpl_image_get_size_y(extracted);
130 f_tot = cpl_image_get_median(extracted);
131 if (fabs(f_tot) < 1e-6) {
132 cpl_msg_warning(cpl_func,
"Quadrant median is 0.0");
133 cpl_image_delete(extracted);
139 labels = cpl_image_new(nx, ny, CPL_TYPE_INT);
140 plabels = cpl_image_get_data_int(labels);
141 for (i = 0; i < nx; i++) {
143 for (j = 0; j < ny; j++)
144 plabels[i + j * nx] = 0;
146 for (j = 0; j < ny; j++)
147 plabels[i + j * nx] = 1;
151 if ((aperts = cpl_apertures_new_from_image(extracted, labels)) == NULL) {
152 cpl_msg_error(cpl_func,
"Cannot compute the even columns median");
153 cpl_image_delete(extracted);
154 cpl_image_delete(labels);
158 cpl_image_delete(extracted);
159 cpl_image_delete(labels);
160 f_even = cpl_apertures_get_median(aperts, 1);
161 cpl_apertures_delete(aperts);
164 *r_even = f_even / f_tot;
180 cpl_imagelist *freq_i;
181 cpl_imagelist *freq_i_amp;
192 nx = cpl_image_get_size_x(in);
195 in_real = cpl_image_cast(in, CPL_TYPE_DOUBLE);
196 in_imag = cpl_image_duplicate(in_real);
197 cpl_image_multiply_scalar(in_imag, 0.0);
200 cpl_image_fft(in_real, in_imag, CPL_FFT_DEFAULT);
203 freq_i = cpl_imagelist_new();
204 cpl_imagelist_set(freq_i, in_real, 0);
205 cpl_imagelist_set(freq_i, in_imag, 1);
208 freq_i_amp = irplib_oddeven_cube_conv_xy_rtheta(freq_i);
209 cpl_imagelist_delete(freq_i);
212 cur_im = cpl_imagelist_get(freq_i_amp, 0);
213 pcur_im = cpl_image_get_data_double(cur_im);
216 hf_med = cpl_vector_new(5);
218 cpl_vector_set(hf_med, 0, pcur_im[nx / 2 + 1]);
219 cpl_vector_set(hf_med, 1, pcur_im[nx / 2 + 2]);
220 cpl_vector_set(hf_med, 2, pcur_im[nx / 2 + 3]);
221 cpl_vector_set(hf_med, 3, pcur_im[nx / 2]);
222 cpl_vector_set(hf_med, 4, pcur_im[nx / 2 - 1]);
224 pcur_im[nx / 2 + 1] = cpl_vector_get_median(hf_med);
225 cpl_vector_delete(hf_med);
228 freq_i = irplib_oddeven_cube_conv_rtheta_xy(freq_i_amp);
229 cpl_imagelist_delete(freq_i_amp);
231 cpl_image_fft(cpl_imagelist_get(freq_i, 0), cpl_imagelist_get(freq_i, 1),
233 cleaned = cpl_image_cast(cpl_imagelist_get(freq_i, 0), CPL_TYPE_FLOAT);
234 cpl_imagelist_delete(freq_i);
252static cpl_imagelist *
253irplib_oddeven_cube_conv_xy_rtheta(cpl_imagelist *cube_in)
255 cpl_imagelist *cube_out;
269 np = cpl_imagelist_get_size(cube_in);
274 tmp_im = cpl_imagelist_get(cube_in, 0);
275 pim1 = cpl_image_get_data_double(tmp_im);
276 nx = cpl_image_get_size_x(tmp_im);
277 ny = cpl_image_get_size_y(tmp_im);
278 tmp_im = cpl_imagelist_get(cube_in, 1);
279 pim2 = cpl_image_get_data_double(tmp_im);
282 cube_out = cpl_imagelist_duplicate(cube_in);
284 tmp_im = cpl_imagelist_get(cube_out, 0);
285 pim3 = cpl_image_get_data_double(tmp_im);
286 tmp_im = cpl_imagelist_get(cube_out, 1);
287 pim4 = cpl_image_get_data_double(tmp_im);
289 for (j = 0; j < ny; j++) {
290 for (i = 0; i < nx; i++) {
291 re = (double)pim1[i + j * nx];
292 im = (double)pim2[i + j * nx];
293 mod = (double)(sqrt(re * re + im * im));
295 phase = (double)atan2(im, re);
298 pim3[i + j * nx] = mod;
299 pim4[i + j * nx] = phase;
319static cpl_imagelist *
320irplib_oddeven_cube_conv_rtheta_xy(cpl_imagelist *cube_in)
322 cpl_imagelist *cube_out;
336 np = cpl_imagelist_get_size(cube_in);
341 tmp_im = cpl_imagelist_get(cube_in, 0);
342 pim1 = cpl_image_get_data_double(tmp_im);
343 nx = cpl_image_get_size_x(tmp_im);
344 ny = cpl_image_get_size_y(tmp_im);
345 tmp_im = cpl_imagelist_get(cube_in, 1);
346 pim2 = cpl_image_get_data_double(tmp_im);
349 cube_out = cpl_imagelist_duplicate(cube_in);
351 tmp_im = cpl_imagelist_get(cube_out, 0);
352 pim3 = cpl_image_get_data_double(tmp_im);
353 tmp_im = cpl_imagelist_get(cube_out, 1);
354 pim4 = cpl_image_get_data_double(tmp_im);
356 for (j = 0; j < ny; j++) {
357 for (i = 0; i < nx; i++) {
358 mod = (double)pim1[i + j * nx];
359 phase = (double)pim2[i + j * nx];
360 re = (double)(mod * cos(phase));
361 im = (double)(mod * sin(phase));
362 pim3[i + j * nx] = re;
363 pim4[i + j * nx] = im;
int irplib_oddeven_monitor(const cpl_image *in, int iquad, double *r_even)
Estimate the odd/even rate in an image quadrant.
cpl_image * irplib_oddeven_correct(const cpl_image *in)
Correct the odd/even in an image.