39 #include "irplib_oddeven.h"
45 static cpl_imagelist * irplib_oddeven_cube_conv_xy_rtheta(cpl_imagelist *) ;
46 static cpl_imagelist * irplib_oddeven_cube_conv_rtheta_xy(cpl_imagelist *) ;
70 cpl_image * extracted ;
73 int llx, lly, urx, ury ;
75 double f_even, f_tot ;
76 cpl_apertures * aperts ;
80 if (in == NULL || r_even == NULL)
return -1 ;
81 nx = cpl_image_get_size_x(in) ;
82 ny = cpl_image_get_size_y(in) ;
86 llx = 1 ; lly = 1 ; urx = nx/2 ; ury = ny/2 ; break ;
88 llx = (nx/2)+1 ; lly = 1 ; urx = nx ; ury = ny/2 ; break ;
90 llx = 1 ; lly = (ny/2)+1 ; urx = nx/2 ; ury = ny ; break ;
92 llx = (nx/2)+1 ; lly = (ny/2)+1 ; urx = nx ; ury = ny ; break ;
94 llx = 1 ; lly = 1 ; urx = nx ; ury = ny ; break ;
96 cpl_msg_error(cpl_func,
"Unsupported mode") ;
102 if ((extracted = cpl_image_extract(in, llx, lly, urx, ury)) == NULL) {
103 cpl_msg_error(cpl_func,
"Cannot extract quadrant") ;
107 nx = cpl_image_get_size_x(extracted) ;
108 ny = cpl_image_get_size_y(extracted) ;
111 f_tot = cpl_image_get_median(extracted) ;
112 if (fabs(f_tot) < 1e-6) {
113 cpl_msg_warning(cpl_func,
"Quadrant median is 0.0") ;
114 cpl_image_delete(extracted) ;
120 labels = cpl_image_new(nx, ny, CPL_TYPE_INT) ;
121 plabels = cpl_image_get_data_int(labels) ;
122 for (i=0 ; i<nx ; i++) {
123 if (i % 2)
for (j=0 ; j<ny ; j++) plabels[i+j*nx] = 0 ;
124 else for (j=0 ; j<ny ; j++) plabels[i+j*nx] = 1 ;
128 if ((aperts = cpl_apertures_new_from_image(extracted, labels)) == NULL) {
129 cpl_msg_error(cpl_func,
"Cannot compute the even columns median") ;
130 cpl_image_delete(extracted) ;
131 cpl_image_delete(labels) ;
135 cpl_image_delete(extracted) ;
136 cpl_image_delete(labels) ;
137 f_even = cpl_apertures_get_median(aperts, 1) ;
138 cpl_apertures_delete(aperts) ;
141 *r_even = f_even / f_tot ;
154 cpl_image * in_real ;
155 cpl_image * in_imag ;
156 cpl_imagelist * freq_i ;
157 cpl_imagelist * freq_i_amp ;
160 cpl_image * cleaned ;
162 cpl_vector * hf_med ;
165 if (in==NULL)
return NULL ;
167 nx = cpl_image_get_size_x(in) ;
170 in_real = cpl_image_cast(in, CPL_TYPE_DOUBLE) ;
171 in_imag = cpl_image_duplicate(in_real) ;
172 cpl_image_multiply_scalar(in_imag, 0.0) ;
175 cpl_image_fft(in_real, in_imag, CPL_FFT_DEFAULT) ;
178 freq_i = cpl_imagelist_new() ;
179 cpl_imagelist_set(freq_i, in_real, 0) ;
180 cpl_imagelist_set(freq_i, in_imag, 1) ;
183 freq_i_amp = irplib_oddeven_cube_conv_xy_rtheta(freq_i);
184 cpl_imagelist_delete(freq_i) ;
187 cur_im = cpl_imagelist_get(freq_i_amp, 0) ;
188 pcur_im = cpl_image_get_data_double(cur_im) ;
191 hf_med = cpl_vector_new(5);
193 cpl_vector_set(hf_med, 0, pcur_im[nx/2 + 1]);
194 cpl_vector_set(hf_med, 1, pcur_im[nx/2 + 2]);
195 cpl_vector_set(hf_med, 2, pcur_im[nx/2 + 3]);
196 cpl_vector_set(hf_med, 3, pcur_im[nx/2 ]);
197 cpl_vector_set(hf_med, 4, pcur_im[nx/2 -1]);
199 pcur_im[nx / 2 + 1] = cpl_vector_get_median(hf_med);
200 cpl_vector_delete(hf_med);
203 freq_i = irplib_oddeven_cube_conv_rtheta_xy(freq_i_amp) ;
204 cpl_imagelist_delete(freq_i_amp) ;
206 cpl_image_fft(cpl_imagelist_get(freq_i, 0), cpl_imagelist_get(freq_i, 1),
208 cleaned = cpl_image_cast(cpl_imagelist_get(freq_i, 0), CPL_TYPE_FLOAT) ;
209 cpl_imagelist_delete(freq_i) ;
227 static cpl_imagelist * irplib_oddeven_cube_conv_xy_rtheta(
228 cpl_imagelist * cube_in)
230 cpl_imagelist * cube_out ;
242 if (cube_in == NULL)
return NULL ;
243 np = cpl_imagelist_get_size(cube_in) ;
244 if (np != 2)
return NULL ;
247 tmp_im = cpl_imagelist_get(cube_in, 0) ;
248 pim1 = cpl_image_get_data_double(tmp_im) ;
249 nx = cpl_image_get_size_x(tmp_im) ;
250 ny = cpl_image_get_size_y(tmp_im) ;
251 tmp_im = cpl_imagelist_get(cube_in, 1) ;
252 pim2 = cpl_image_get_data_double(tmp_im) ;
255 cube_out = cpl_imagelist_duplicate(cube_in) ;
257 tmp_im = cpl_imagelist_get(cube_out, 0) ;
258 pim3 = cpl_image_get_data_double(tmp_im) ;
259 tmp_im = cpl_imagelist_get(cube_out, 1) ;
260 pim4 = cpl_image_get_data_double(tmp_im) ;
262 for (j=0 ; j<ny ; j++) {
263 for (i=0 ; i<nx ; i++) {
264 re = (double)pim1[i+j*nx] ;
265 im = (double)pim2[i+j*nx] ;
266 mod = (double)(sqrt(re*re + im*im)) ;
268 phase = (double)atan2(im, re) ;
272 pim4[i+j*nx] = phase ;
292 static cpl_imagelist * irplib_oddeven_cube_conv_rtheta_xy(
293 cpl_imagelist * cube_in)
295 cpl_imagelist * cube_out ;
307 if (cube_in == NULL)
return NULL ;
308 np = cpl_imagelist_get_size(cube_in) ;
309 if (np != 2)
return NULL ;
312 tmp_im = cpl_imagelist_get(cube_in, 0) ;
313 pim1 = cpl_image_get_data_double(tmp_im) ;
314 nx = cpl_image_get_size_x(tmp_im) ;
315 ny = cpl_image_get_size_y(tmp_im) ;
316 tmp_im = cpl_imagelist_get(cube_in, 1) ;
317 pim2 = cpl_image_get_data_double(tmp_im) ;
320 cube_out = cpl_imagelist_duplicate(cube_in) ;
322 tmp_im = cpl_imagelist_get(cube_out, 0) ;
323 pim3 = cpl_image_get_data_double(tmp_im) ;
324 tmp_im = cpl_imagelist_get(cube_out, 1) ;
325 pim4 = cpl_image_get_data_double(tmp_im) ;
327 for (j=0 ; j<ny ; j++) {
328 for (i=0 ; i<nx ; i++) {
329 mod = (double)pim1[i+j*nx] ;
330 phase = (double)pim2[i+j*nx] ;
331 re = (double)(mod * cos(phase));
332 im = (double)(mod * sin(phase));
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.