32 #define POSIX_SOURCE 1
33 #include "sinfo_vltPort.h"
43 #include "sinfo_detlin.h"
44 #include "sinfo_recipes.h"
45 #include "sinfo_fit_curve.h"
80 sinfo_new_fit_intensity_course(cpl_imagelist * flatStack,
85 cpl_imagelist * ret_iml ;
95 cpl_image* img_tmp=NULL;
96 sx=cpl_image_get_size_x(cpl_imagelist_get(flatStack,0));
97 sy=cpl_image_get_size_y(cpl_imagelist_get(flatStack,0));
98 sz=cpl_imagelist_get_size(flatStack);
100 stats=(Stats**) cpl_calloc(sz,
sizeof(Stats*)) ;
102 if ( NULL == flatStack )
113 ret_iml = cpl_imagelist_new();
114 for ( z = 0 ; z < order+1 ; z++ )
116 img_tmp=cpl_image_new(sx,sy,CPL_TYPE_FLOAT);
117 cpl_imagelist_set(ret_iml,img_tmp,z);
120 for ( z = 0 ; z < sz ; z++ )
123 sinfo_new_image_stats_on_rectangle(cpl_imagelist_get(flatStack,z),
130 if ( stats[z] == NULL )
134 cpl_imagelist_delete(ret_iml) ;
142 for ( i = 0 ; i < sx*sy ; i++ )
145 if ( NULL == ( points = (dpoint*) cpl_calloc(sz,
sizeof(dpoint)) ) )
148 cpl_imagelist_delete(ret_iml) ;
152 for ( z = 0 ; z < sz ; z++ )
154 if(NULL==(img_tmp = cpl_imagelist_get(flatStack,z))) {
156 cpl_imagelist_delete(ret_iml) ;
159 psrcdata=cpl_image_get_data_float(img_tmp);
160 points[z].x = (double)stats[z]->cleanmean ;
161 points[z].y = (double)psrcdata[i] ;
166 if ( NULL == ( coeffs = sinfo_fit_1d_poly(order, points, sz, NULL) ) )
169 for ( z = 0 ; z < order+1 ; z++ )
171 presdata=cpl_image_get_data_float(cpl_imagelist_get(ret_iml,z));
177 for ( z = 0 ; z < order+1 ; z++ )
179 if(NULL==(img_tmp = cpl_imagelist_get(ret_iml,z))) {
181 cpl_imagelist_delete(ret_iml) ;
184 presdata=cpl_image_get_data_float(img_tmp);
185 presdata[i] = coeffs[z] ;
193 for ( z = 0 ; z < sz ; z++ )
195 cpl_free (stats[z]) ;
225 cpl_image * sinfo_new_search_bad_pixels( cpl_imagelist * coeffs,
226 double threshSigmaFactor,
227 double nonlinearThresh,
237 cpl_image * img_res ;
238 cpl_image* img_src=NULL;
240 float* psrcdata=NULL;
241 float* presdata=NULL;
243 if ( NULL == coeffs )
248 if ( threshSigmaFactor <= 0. )
253 if ( nonlinearThresh <= 0. )
260 sz=cpl_imagelist_get_size(coeffs);
269 img_src=cpl_imagelist_get(coeffs,1);
270 sx=cpl_image_get_size_x(img_src);
271 sy=cpl_image_get_size_y(img_src);
274 if ( NULL == (img_res = cpl_image_new(sx, sy,CPL_TYPE_FLOAT)) )
285 stats = sinfo_new_image_stats_on_rectangle(img_src,
292 cpl_image_delete(img_res) ;
297 psrcdata=cpl_image_get_data_float(img_src);
298 presdata=cpl_image_get_data_float(img_res);
299 for ( i = 0 ; i < (int) sx*sy ; i++ )
302 if ( isnan(psrcdata[i]) )
306 else if ( stats->cleanmean - psrcdata[i] >
307 threshSigmaFactor*stats->cleanstdev )
327 for ( z = 2 ; z < sz ; z++ )
329 img_src=cpl_imagelist_get(coeffs,z);
330 sx=cpl_image_get_size_x(img_src);
331 sy=cpl_image_get_size_y(img_src);
333 psrcdata=cpl_image_get_data_float(img_src);
334 stats = sinfo_new_image_stats_on_rectangle(img_src, loReject,
335 hiReject, 0, 0, sx-1, sy-1) ;
339 cpl_image_delete(img_res) ;
342 presdata=cpl_image_get_data_float(img_res);
343 for ( i = 0 ; i < (int) sx*sy ; i++ )
345 if ( presdata[i] == 1. &&
346 (fabs(psrcdata[i] - stats->cleanmean) >
347 threshSigmaFactor*stats->cleanstdev ||
348 fabs(psrcdata[i]) > nonlinearThresh ) )
383 cpl_image * sinfo_new_search_bad_pixels_via_noise(cpl_imagelist * darks,
384 float threshSigmaFactor,
397 cpl_image* img_src=NULL;
399 float* psrcdata=NULL;
410 if ( threshSigmaFactor <= 0. )
415 if ( loReject < 0. || hiReject < 0. || (loReject + hiReject) >= 100. )
421 lz=cpl_imagelist_get_size(darks);
427 img_src=cpl_imagelist_get(darks,0);
429 lx = cpl_image_get_size_x(img_src) ;
430 ly = cpl_image_get_size_y(img_src) ;
432 low_n = (int)(loReject/100. *(
float)lz) ;
433 high_n = (int)(hiReject/100. *(
float)lz) ;
434 if (NULL == (bp_map = cpl_image_new (lx, ly,CPL_TYPE_FLOAT) ) )
439 pbpdata=cpl_image_get_data(bp_map);
440 if (NULL == (spectrum = (
float*) cpl_calloc(lz,
sizeof(
float)) ) )
445 for ( row = 0 ; row < ly ; row++ ) {
447 for ( col = 0 ; col < lx ; col++ ) {
449 for ( z = 0 ; z < lz ; z++ ) {
450 img_src=cpl_imagelist_get(darks,z);
451 psrcdata=cpl_image_get_data(img_src);
452 spectrum[z] = psrcdata[col+lx*row] ;
454 sinfo_pixel_qsort(spectrum, lz) ;
458 for ( i = low_n ; i < lz - high_n ; i++ ) {
459 pix_sum += (double)spectrum[i] ;
460 sqr_sum += ((double)spectrum[i]*(
double)spectrum[i]) ;
464 pix_sum /= (double)n ;
465 sqr_sum /= (double)n ;
467 pbpdata[col+lx*row] = (float)sqrt(sqr_sum - pix_sum*pix_sum) ;
471 if ( NULL == (stats = sinfo_new_image_stats_on_rectangle (bp_map, loReject,
472 hiReject, 200, 200, 800, 800) ) )
475 cpl_image_delete (bp_map) ;
481 for ( row = 0 ; row < ly ; row++ ) {
482 for ( col = 0 ; col < lx ; col++ ) {
483 if (pbpdata[col+lx*row] >
484 stats->cleanmean+threshSigmaFactor*stats->cleanstdev ||
485 pbpdata[col+lx*row] <
486 stats->cleanmean-threshSigmaFactor*stats->cleanstdev)
488 pbpdata[col+lx*row] = 0. ;
492 pbpdata[col+lx*row] = 1. ;
510 int sinfo_new_count_bad_pixels (cpl_image * bad )
513 int sx=cpl_image_get_size_x(bad);
514 int sy=cpl_image_get_size_y(bad);
515 float* pbpdata=cpl_image_get_data(bad);
518 for ( i = 0 ; i < (int) sx*sy ; i++ )
520 if ( pbpdata[i] == 0 || isnan(pbpdata[i]) )
556 cpl_image * sinfo_new_abs_dist_image(cpl_image * im,
float fmedian )
562 pixelvalue median_dist ;
563 pixelvalue* pix_dist=NULL ;
579 image = cpl_image_duplicate ( im ) ;
589 pdata = cpl_image_get_data(im);
590 lx=cpl_image_get_size_x(im);
591 ly=cpl_image_get_size_y(im);
592 pix_dist=(pixelvalue*)cpl_calloc(lx*ly,
sizeof(pixelvalue)) ;
594 for ( i = 0 ; i < (int) lx*ly ; i++ )
597 if ( isnan(pdata[i]) )
603 value = (pixelvalue * )cpl_calloc ( 8,
sizeof ( pixelvalue * ) ) ;
604 position = (
int * ) cpl_calloc ( 8,
sizeof (
int * ) ) ;
610 position[0] = i + lx - 1 ;
611 position[1] = i + lx ;
612 position[2] = i + lx + 1 ;
613 position[3] = i + 1 ;
614 position[4] = i - lx + 1 ;
615 position[5] = i - lx ;
616 position[6] = i - lx - 1 ;
617 position[7] = i - 1 ;
625 if ( i >= 0 && i < lx )
627 position[4] += 2 * lx ;
628 position[5] += 2 * lx ;
629 position[6] += 2 * lx ;
631 else if ( i >= ((
int) lx*ly - lx ) && i < (
int) lx*ly )
633 position[0] -= 2 * lx ;
634 position[1] -= 2 * lx ;
635 position[2] -= 2 * lx ;
637 else if ( i % lx == 0 )
643 else if ( i % lx == lx - 1 )
657 for ( j = 0 ; j < nposition ; j ++ )
659 if ( !isnan(pdata[position[j]]) )
661 value[n] = pdata[position[j]] ;
667 if ( nposition <= 1 )
677 for ( n = 0 ; n < nposition ; n++ )
679 dist += (pdata[i] - value[n])*(pdata[i] - value[n]) ;
681 dist = sqrt(dist)/(float) nposition ;
684 sum += (double)dist ;
685 sum2 += (double)dist * (
double)dist ;
691 stdev = sqrt(sum2 - sum*sum) ;
693 median_dist = sinfo_new_median(pix_dist, m) ;
695 for ( i = 0 ; i < (int) lx*ly ; i++ )
698 if ( isnan(pdata[i]) )
704 value = (pixelvalue * )cpl_calloc ( 8,
sizeof ( pixelvalue * ) ) ;
705 position = (
int * ) cpl_calloc ( 8,
sizeof (
int * ) ) ;
711 position[0] = i + lx - 1 ;
712 position[1] = i + lx ;
713 position[2] = i + lx + 1 ;
714 position[3] = i + 1 ;
715 position[4] = i - lx + 1 ;
716 position[5] = i - lx ;
717 position[6] = i - lx - 1 ;
718 position[7] = i - 1 ;
726 if ( i >= 0 && i < lx )
728 position[4] += 2 * lx ;
729 position[5] += 2 * lx ;
730 position[6] += 2 * lx ;
732 else if ( i >= ((
int) lx*ly - lx ) && i < (
int) lx*ly )
734 position[0] -= 2 * lx ;
735 position[1] -= 2 * lx ;
736 position[2] -= 2 * lx ;
738 else if ( i % lx == 0 )
744 else if ( i % lx == lx - 1 )
758 for ( j = 0 ; j < nposition ; j ++ )
760 if ( !isnan(pdata[position[j]]) )
762 value[n] = pdata[position[j]] ;
768 if ( nposition <= 1 )
778 for ( n = 0 ; n < nposition ; n++ )
780 dist += (pdata[i] - value[n])*(pdata[i] - value[n]) ;
782 dist = sqrt(dist)/(float) nposition ;
802 else if ( fmedian < 0 &&
803 fabs ( median_dist - dist ) >= -fmedian*stdev )
807 else if ( fmedian > 0 &&
808 fabs ( median_dist - dist ) >=
809 fmedian*stdev * sqrt(fabs(dist)) )
816 cpl_free (position) ;
821 cpl_free (position) ;
861 cpl_image * sinfo_new_local_median_image( cpl_image * im,
873 int llx, lly, urx, ury ;
885 if ( half_box_size < 0 )
891 image = cpl_image_duplicate ( im ) ;
892 lx=cpl_image_get_size_x(im);
893 ly=cpl_image_get_size_y(im);
894 pidata=cpl_image_get_data(im);
895 podata=cpl_image_get_data(image);
900 for ( i = 0 ; i < (int) lx*ly ; i++ )
903 if ( isnan(pidata[i]) )
909 llx = i%lx - half_box_size ;
910 if ( llx < 0 ) llx = 0 ;
911 lly = i%ly - half_box_size ;
912 if ( lly < 0 ) lly = 0 ;
913 urx = i%lx + half_box_size ;
914 if ( urx >= lx ) urx = lx - 1 ;
915 ury = i%ly + half_box_size ;
916 if ( ury >= ly ) ury = ly - 1 ;
918 if ( NULL == (stats = sinfo_new_image_stats_on_rectangle (im, loReject,
919 hiReject, llx, lly, urx, ury)) )
927 value = (pixelvalue * )cpl_calloc ( 8,
sizeof ( pixelvalue * ) ) ;
928 position = (
int * ) cpl_calloc ( 8,
sizeof (
int * ) ) ;
934 position[0] = i + lx - 1 ;
935 position[1] = i + lx ;
936 position[2] = i + lx + 1 ;
937 position[3] = i + 1 ;
938 position[4] = i - lx + 1 ;
939 position[5] = i - lx ;
940 position[6] = i - lx - 1 ;
941 position[7] = i - 1 ;
949 if ( i >= 0 && i < lx )
951 position[4] += 2 * lx ;
952 position[5] += 2 * lx ;
953 position[6] += 2 * lx ;
955 else if ( i >= ((
int) lx*ly - lx ) && i < (
int) lx*ly )
957 position[0] -= 2 * lx ;
958 position[1] -= 2 * lx ;
959 position[2] -= 2 * lx ;
961 else if ( i % lx == 0 )
967 else if ( i % lx == lx - 1 )
981 for ( j = 0 ; j < nposition ; j ++ )
983 if ( !isnan(pidata[position[j]]) )
985 value[n] = pidata[position[j]] ;
991 if ( nposition <= 1 )
1002 sinfo_pixel_qsort( value, nposition ) ;
1003 if ( nposition % 2 == 1 )
1005 median = value [ nposition/2 ] ;
1009 median = ( value [nposition/2 - 1] + value [nposition/2] ) / 2. ;
1024 podata[i] = median ;
1026 else if ( fmedian < 0 &&
1027 fabs ( median - pidata[i] ) >= -fmedian * stats->cleanstdev)
1029 podata[i] = median ;
1031 else if ( fmedian > 0 &&
1032 fabs ( median - pidata[i] ) >= fmedian * sqrt(fabs(median)) )
1034 podata[i] = median ;
1039 cpl_free (position) ;
1045 cpl_free (position) ;
1076 cpl_image * sinfo_new_mean_image_in_spec( cpl_image * im,
float fmedian )
1079 pixelvalue * value ;
1095 image = cpl_image_duplicate ( im ) ;
1096 lx=cpl_image_get_size_x(im);
1097 ly=cpl_image_get_size_y(im);
1098 pidata=cpl_image_get_data(im);
1099 podata=cpl_image_get_data(image);
1105 for ( i = 0 ; i < (int) lx*ly ; i++ )
1108 if ( isnan(pidata[i]) )
1115 value = (pixelvalue * )cpl_calloc ( 4,
sizeof ( pixelvalue * ) ) ;
1116 position = (
int * ) cpl_calloc ( 4,
sizeof (
int * ) ) ;
1122 position[0] = i + lx ;
1123 position[1] = i + 2*lx ;
1124 position[2] = i - lx ;
1125 position[3] = i - 2*lx ;
1133 if ( i >= 0 && i < lx )
1135 position[2] += 2 * lx ;
1136 position[3] += 4 * lx ;
1138 else if ( i >= ((
int) lx*ly - lx ) && i < (
int) lx*ly )
1140 position[0] -= 2 * lx ;
1141 position[1] -= 4 * lx ;
1151 for ( j = 0 ; j < nposition ; j ++ )
1153 if ( !isnan(pidata[position[j]]) )
1155 value[n] = pidata[position[j]] ;
1161 if ( nposition < 1 )
1165 cpl_free(position) ;
1171 for ( n = 0 ; n < nposition ; n++ )
1175 mean /= (float) nposition ;
1189 else if ( fmedian < 0 &&
1190 fabs ( mean - pidata[i] ) >= -fmedian )
1194 else if ( fmedian > 0 &&
1195 fabs ( mean - pidata[i] ) >= fmedian * sqrt(fabs(mean)) )
1202 cpl_free (position) ;
1207 cpl_free (position) ;