/* pgmabel.c - read a portable graymap and making the deconvolution ** ** Deconvolution of an axial-symmetric image of an rotation symmetrical ** process by solving the linear equation system with y-Axis as ** symmetry-line ** ** Copyright (C) 1997-2006 by German Aerospace Research establishment ** ** Author: Volker Schmidt ** lefti@voyager.boerde.de ** ** Permission to use, copy, modify, and distribute this software and its ** documentation for any purpose and without fee is hereby granted, provided ** that the above copyright notice appear in all copies and that both that ** copyright notice and this permission notice appear in supporting ** documentation. This software is provided "as is" without express or ** implied warranty. ** ** $HISTORY: ** ** 24 Jan 2002 : 001.009 : some optimzization ** 22 Jan 2002 : 001.008 : some stupid calculations changed ** 08 Aug 2001 : 001.007 : new usage (netpbm-conform) ** 27 Jul 1998 : 001.006 : First try of error correction ** 26 Mar 1998 : 001.005 : Calculating the dl's before transformation ** 06 Feb 1998 : 001.004 : Include of a logo in the upper left edge ** 26 Nov 1997 : 001.003 : Some bug fixes and reading only lines ** 25 Nov 1997 : 001.002 : include of pixsize for getting scale invariant ** 03 Sep 1997 : 001.001 : only define for PID2 ** 03 Sep 1997 : 001.000 : First public release ** 21 Aug 1997 : 000.909 : Recalculate the streching-factor ** 20 Aug 1997 : 000.908 : -left and -right for calculating only one side ** 20 Aug 1997 : 000.906 : correction of divisor, include of -factor ** 15 Aug 1997 : 000.905 : Include of -help and -axis */ static const char* const version="$VER: pgmabel 1.009 (24 Jan 2002)"; #include #include /* for calloc */ #include "pm_c_util.h" #include "mallocvar.h" #include "pgm.h" #ifndef PID2 /* PI/2 (on AMIGA always defined) */ #define PID2 1.57079632679489661923 #endif /* some global variables */ static double *aldl, *ardl; /* pointer for weighting factors */ /* ---------------------------------------------------------------------------- ** procedure for calculating the sum of the calculated surfaces with the ** weight of the surface ** n <- index of end point of the summation ** N <- width of the calculated row ** xr <- array of the calculated elements of the row ** adl <- pre-calculated surface coefficient for each segment */ static double Sum ( int n, double *xr, int N, double *adl) { int k; double result=0.0; if (n==0) return(0.0); /* outer ring is 0 per definition */ for (k=0 ; k<=(n-1) ; k++) { result += xr[k] * ( adl[k*N+n] - adl[(k+1)*N+n]); /* result += xr[k] * ( dr(k,n+0.5,N) - dr(k+1,n+0.5,N)); */ } return(result); } /* ---------------------------------------------------------------------------- ** procedure for calculating the surface coefficient for the Integration ** R, N <- indizes of the coefficient ** r <- radial position of the center of the surface */ static double dr ( int R, double r, int N) { double a; double b; a=(double) N-R ; b=(double) N-r ; return(sqrt(a*a-b*b)); } /* ---------------------------------------------------------------------------- ** procedure for making the Abel integration for deconvolution of the image ** y <-> array with values for deconvolution and results ** N <- width of the array ** adl <- array with pre-calculated weighting factors */ static void abel ( float *y, int N, double *adl) { register int n; double *rho, *rhop; /* results and new index */ MALLOCARRAY(rho, N); if( !rho ) pm_error( "out of memory" ); for (n=0 ; n=1 )&&( n0?temp:0); } for ( col = midcol; col < cols; ++col ) /* right side */ { trow[cols-col-1] = (float) (grayorig[col]); } if ( right ) abel(trow,(cols-midcol),ardl); /* deconvolution */ for ( col = midcol; col < cols; ++col) /* writing right side */ { temp = (int)(trow[cols-col-1]/r_div); temp = (temp>0?temp:0); grayrow[col] = temp; } pgm_writepgmrow( stdout, grayrow, cols, maxval, 0 ); /* saving row */ } pm_close( ifp ); pm_close( stdout ); /* closing output */ free( trow ); /* deconvolution is done, clear memory */ pgm_freerow( grayorig ); pgm_freerow( grayrow ); free(aldl); free(ardl); /* all used memory freed (i hope) */ exit( 0 ); /* end of procedure */ }