99 #include "sinfo_vltPort.h"
109 #include "sinfo_merge.h"
110 #include "sinfo_globals.h"
130 cpl_image * sinfo_sinfo_merge_images ( cpl_image * im1,
132 cpl_image * res_image )
134 cpl_image * out_image ;
135 cpl_image * residual ;
147 float* poutdata=NULL;
148 float* ptmpdata=NULL;
152 if ( im1 == NULL || im2 == NULL || res_image == NULL)
157 lx1=cpl_image_get_size_x(im1);
158 ly1=cpl_image_get_size_y(im1);
160 lx2=cpl_image_get_size_x(im2);
161 ly2=cpl_image_get_size_y(im2);
165 pi1data=cpl_image_get_data_float(im1);
166 pi2data=cpl_image_get_data_float(im2);
167 pirdata=cpl_image_get_data_float(res_image);
170 if ( lx1 != lx2 || ly1 != ly2 )
177 if ( NULL == (out_image = cpl_image_new (lx1, 2 * ly1,CPL_TYPE_FLOAT)) )
182 poutdata=cpl_image_get_data_float(out_image);
184 if ( NULL == (residual = cpl_image_new (lx1, ly1,CPL_TYPE_FLOAT)) )
189 ptmpdata=cpl_image_get_data_float(residual);
192 for ( i = 0 ; i < (int) lx1*ly1 ; i ++ )
194 if ( isnan(pi1data[i]) || isnan(pi2data[i]) )
200 ptmpdata[i] = pi1data[i] - pi2data[i] ;
202 pirdata[i] = ptmpdata[i] ;
206 for ( i = 0 ; i < ly1 ; i ++ )
208 for ( j = 0 ; j < lx1 ; j ++ )
211 poutdata[2*i*lx1 + j] = pi1data[i*lx1 + j] ;
212 poutdata[(2*i+1) * lx1 + j] = pi2data[i*lx1 + j] ;
216 cpl_image_delete (residual) ;
238 cpl_image * sinfo_new_remove_general_offset( cpl_image * im1,
240 cpl_image * res_image,
243 cpl_image * out_image ;
244 cpl_image * residual ;
245 pixelvalue sum, sqr_sum ;
246 pixelvalue mean, stdev ;
263 float* poutdata=NULL;
264 float* ptmpdata=NULL;
268 if ( im1 == NULL || im2 == NULL )
273 lx1=cpl_image_get_size_x(im1);
274 ly1=cpl_image_get_size_y(im1);
276 lx2=cpl_image_get_size_x(im2);
277 ly2=cpl_image_get_size_y(im2);
281 pi1data=cpl_image_get_data_float(im1);
282 pi2data=cpl_image_get_data_float(im2);
285 if ( lx1 != lx2 || ly1 != ly2 )
294 "is 0 or smaller ") ;
299 if ( NULL == (residual = cpl_image_new (lx1, ly1, CPL_TYPE_FLOAT)) )
305 out_image = cpl_image_duplicate( im2 ) ;
306 poutdata=cpl_image_get_data_float(out_image);
307 ptmpdata=cpl_image_get_data_float(residual);
308 lxt=cpl_image_get_size_x(residual);
309 lyt=cpl_image_get_size_y(residual);
319 for ( i = 0 ; i < (int) lx1*ly1 ; i ++ )
321 if ( isnan(pi1data[i]) || isnan(pi2data[i]) )
328 ptmpdata[i] = pi1data[i] - pi2data[i] ;
332 sqr_sum += (ptmpdata[i]) * (ptmpdata[i]) ;
342 mean = sum / (pixelvalue) npix ;
344 stdev = 3 * sqrt(( sqr_sum - sum*mean ) / (pixelvalue)(npix - 1)) ;
349 for ( i = 0 ; i < (int) lxt*lyt ; i++ )
351 if ( fabs( ptmpdata[i] - mean ) > stdev )
362 for ( i = 0 ; i < n * lxt ; i++ )
364 if ( isnan(ptmpdata[i]) )
378 mean = sum / (pixelvalue) npix ;
382 for ( i = 0 ; i < (int) lx2*ly2 ; i++ )
384 if ( isnan(pi2data[i]) )
389 poutdata[i] = pi2data[i] + mean ;
393 if ( res_image != NULL )
399 pirdata=cpl_image_get_data_float(res_image);
402 for ( i = 0 ; i < (int) lxt*lyt ; i++ )
404 if ( isnan(ptmpdata[i]) )
409 pirdata[i] = ptmpdata[i] - mean ;
413 cpl_image_delete (residual) ;
430 cpl_image * sinfo_new_remove_regional_tilt ( cpl_image * im1,
432 cpl_image * res_image )
434 cpl_image * out_image ;
435 cpl_image * filtered ;
436 int i, j, k, npix, nrunning ;
437 pixelvalue a, b, sum, sumx, sumy, sumc, sum2 ;
451 float* poutdata=NULL;
452 float* pfildata=NULL;
455 if ( im1 == NULL || im2 == NULL || res_image == NULL )
460 lx1=cpl_image_get_size_x(im1);
461 ly1=cpl_image_get_size_y(im1);
463 lx2=cpl_image_get_size_x(im2);
464 ly2=cpl_image_get_size_y(im2);
466 lxr=cpl_image_get_size_x(res_image);
467 lyr=cpl_image_get_size_y(res_image);
470 pi1data=cpl_image_get_data_float(im1);
473 pirdata=cpl_image_get_data_float(res_image);
475 if ( lx1 != lx2 || ly1 != ly2 ||
476 lx2 != lxr || ly2 != lyr )
483 if ( NULL == ( filtered = cpl_image_new (lx2, ly2,CPL_TYPE_FLOAT)) )
489 out_image = cpl_image_duplicate( im2 ) ;
490 poutdata=cpl_image_get_data_float(out_image);
491 pfildata=cpl_image_get_data_float(filtered);
492 lxf=cpl_image_get_size_x(filtered);
493 lyf=cpl_image_get_size_y(filtered);
503 for ( j = 0 ; j < lyr ; j ++ )
505 for ( i = 0 ; i < lxr ; i ++ )
509 for (k = i - (nrunning-1)/2 ; k < i + (nrunning+1)/2; k ++ )
521 if ( isnan(pirdata[j*lxr + k]) )
526 sum += pirdata[j*lxr + k] ;
530 pfildata[j*lxr + i] = sum/npix ;
534 pfildata[j*lxr + i] = ZERO ;
548 for ( i = 0 ; i < lxf ; i ++ )
556 for ( j = 0 ; j < lyf ; j ++ )
558 if ( isnan(pfildata[i + j*lxf]) )
562 sumy += pfildata[i + j*lxf] ;
563 sumc += (pfildata[i + j*lxf]) * j ;
568 if ( npix > 2 && fabs(sum2 - sumx*sumx/npix) >= 1e-6 )
570 a = ( sumc - sumx*sumy/npix ) / ( sum2 - sumx*sumx/npix ) ;
571 b = ( sumy - a*sumx ) / npix ;
583 if ( !isnan(a) && !isnan(b) && fabs(a) < 1e8 && fabs(b) < 1e8 )
585 for ( j = 0 ; j < lyf ; j ++ )
587 if ( !isnan(poutdata[i + j*lxf]) )
589 poutdata[i + j*lxf] += a*j+b ;
596 for ( i = 0 ; i < (int) lx1*ly1 ; i ++ )
598 if ( isnan(pi1data[i]) || isnan(poutdata[i]) )
604 pirdata[i] = pi1data[i] - poutdata[i] ;
608 cpl_image_delete (filtered) ;
626 cpl_image * sinfo_new_remove_column_offset ( cpl_image * im1,
628 cpl_image * res_image )
630 cpl_image * out_image ;
631 int i, j, npix, nrunning ;
632 pixelvalue sum, sum2, mean, stdev, median1, median2, ratio ;
633 pixelvalue * column1, * column2 ;
643 float* poutdata=NULL;
645 if ( im1 == NULL || im2 == NULL || res_image == NULL )
650 lx1=cpl_image_get_size_x(im1);
651 ly1=cpl_image_get_size_y(im1);
653 lx2=cpl_image_get_size_x(im2);
654 ly2=cpl_image_get_size_y(im2);
656 lxr=cpl_image_get_size_x(res_image);
657 lyr=cpl_image_get_size_y(res_image);
660 pi1data=cpl_image_get_data_float(im1);
661 pi2data=cpl_image_get_data_float(im2);
662 pirdata=cpl_image_get_data_float(res_image);
664 if ( lx1 != lx2 || ly1 != ly2 ||
665 lx2 != lxr || ly2 != lyr )
671 out_image = cpl_image_duplicate( im2 ) ;
672 poutdata=cpl_image_get_data_float(out_image);
681 for ( i = 0 ; i < lx2 ; i ++ )
687 for ( j = 0 ; j < ly2 ; j ++ )
690 if ( isnan(pirdata[i + j*lxr]) )
694 sum += pirdata[i + j*lxr] ;
695 sum2 += pirdata[i + j*lxr] *
705 mean = sum/(pixelvalue) npix ;
706 if ( (sum2 - sum * mean) < 0 )
714 stdev = 2 * sqrt ( (sum2 - sum*mean)/(pixelvalue)(npix - 1) ) ;
719 if ( fabs(mean)/stdev < 0.5 )
725 for ( j = 0 ; j < lyr ; j ++ )
727 if ( pirdata[i + j*lxr] < mean - stdev ||
728 pirdata[i + j*lxr] > mean + stdev )
730 pirdata[i + j*lxr] = ZERO ;
739 column1 = (pixelvalue *) cpl_calloc ( ly1 ,
sizeof (pixelvalue *) ) ;
740 column2 = (pixelvalue *) cpl_calloc ( ly2 ,
sizeof (pixelvalue *) ) ;
742 for ( j = 0 ; j < lyr ; j++ )
744 if ( isnan(pirdata[i + j*lxr]) )
748 if ( isnan(pi1data[i+j*lx1]) || isnan(pi2data[i+j*lx2]) )
752 column1[nrunning] = pi1data[i + j*lx1] ;
753 column2[nrunning] = pi2data[i + j*lx2] ;
759 if ( nrunning > 0.1*lyr )
766 median2 = sinfo_new_median( column2, nrunning ) ;
769 median1 = sinfo_new_median( column1, nrunning ) ;
770 ratio = median1 / median2 ;
773 for ( j = 0 ; j < ly2 ; j++ )
775 if ( !isnan(pi2data[i + j*lx2]) )
777 poutdata[i + j*lx2] = pi2data[i + j*lx2] * ratio ;
781 poutdata[i + j*lx2] = ZERO ;
787 cpl_free ( column1 ) ;
788 cpl_free ( column2 ) ;
792 for ( i = 0 ; i < (int) lx1*ly1 ; i ++ )
794 if ( isnan(pi1data[i]) || isnan(poutdata[i]) )
800 pirdata[i] = pi1data[i] - poutdata[i] ;
818 sinfo_new_remove_residual_tilt ( cpl_image * im2, cpl_image * res_image )
820 cpl_image * out_image ;
821 cpl_image * residual ;
823 pixelvalue a, b, sum, sumx, sumy, sumc, sum2, mean, stdev ;
830 float* poutdata=NULL;
831 float* ptmpdata=NULL;
836 if ( im2 == NULL || res_image == NULL )
841 lx2=cpl_image_get_size_x(im2);
842 ly2=cpl_image_get_size_y(im2);
843 rlx=cpl_image_get_size_x(res_image);
844 rly=cpl_image_get_size_y(res_image);
846 pirdata=cpl_image_get_data_float(res_image);
848 if ( lx2 != rlx || ly2 != rly )
854 out_image = cpl_image_duplicate( im2 ) ;
855 residual = cpl_image_duplicate( res_image ) ;
856 poutdata=cpl_image_get_data_float(out_image);
857 ptmpdata=cpl_image_get_data_float(residual);
859 for ( i = 0 ; i < lx2; i++ )
864 for ( j = 0 ; j < ly2 ; j++ )
868 if ( isnan(pirdata[i + j*rlx]) )
872 sum += pirdata[i + j*rlx] ;
873 sum2 += pirdata[i + j*rlx] *
884 mean = sum / (pixelvalue) npix ;
885 stdev = 1.5 * sqrt( (sum2 - sum*mean) / (pixelvalue)(npix - 1) ) ;
889 for ( j = 0 ; j < ly2 ; j++ )
891 if ( pirdata[i + j*rlx] < mean - stdev ||
892 pirdata[i + j*rlx] > mean + stdev )
894 pirdata[i + j*rlx] = ZERO ;
906 for ( j = 0 ; j < rly ; j ++ )
908 if ( isnan(pirdata[i + j*rlx]) )
912 sumy += pirdata[i + j*rlx] ;
913 sumc += (pirdata[i + j*rlx]) * j ;
918 if ( npix > 2 && fabs(sum2 - sumx*sumx/npix) >= 1e-6 )
920 a = ( sumc - sumx*sumy/npix ) / ( sum2 - sumx*sumx/npix ) ;
921 b = ( sumy - a*sumx ) / npix ;
933 if ( !isnan(a) && !isnan(b) && fabs(a) < 1e8 && fabs(b) < 1e8 )
935 for ( j = 0 ; j < ly2 ; j ++ )
937 if ( !isnan(poutdata[i+j*lx2]) )
939 poutdata[i + j*lx2] += a*j+b ;
940 pirdata[i + j*lx2] = ptmpdata[i + j*lx2] -(a*j+b) ;
946 cpl_image_delete (residual) ;
963 sinfo_new_remove_residual_offset( cpl_image * im2, cpl_image * res_image )
965 cpl_image * out_image ;
967 pixelvalue res_median ;
968 pixelvalue * column ;
982 if ( im2 == NULL || res_image == NULL )
987 lx2=cpl_image_get_size_x(im2);
988 ly2=cpl_image_get_size_y(im2);
989 rlx=cpl_image_get_size_x(res_image);
990 rly=cpl_image_get_size_y(res_image);
991 pi2data=cpl_image_get_data_float(im2);
992 pirdata=cpl_image_get_data_float(res_image);
995 if ( lx2 != rlx || ly2 != rly )
1001 out_image = cpl_image_duplicate( im2 ) ;
1002 poudata=cpl_image_get_data_float(res_image);
1007 column = (pixelvalue *) cpl_calloc ( ly2 ,
sizeof (pixelvalue *) ) ;
1009 for ( i = 0 ; i < lx2 ; i++ )
1015 for ( j = 0 ; j < rly ; j++ )
1017 if ( isnan(pirdata[i + j*rlx]) )
1022 column[npix] = pirdata[i + j*rlx] ;
1027 if ( npix > 0.1 * rly )
1029 res_median = sinfo_new_median( column, npix ) ;
1036 for ( j = 0 ; j < ly2 ; j++ )
1038 if ( !isnan(pi2data[i+j*lx2]))
1040 poudata[i + j*lx2] = pi2data[i + j*lx2] + res_median ;
1044 poudata[i + j*lx2] = ZERO ;
1046 if ( !isnan(pirdata[i + j*rlx]) )
1048 pirdata[i + j*rlx] -= res_median ;
1052 cpl_free ( column ) ;