Doxygen Source Code Documentation
abut.c File Reference
#include "mrilib.h"
#include <string.h>
Go to the source code of this file.
Defines | |
#define | LINEAR 7 |
#define | BLOCKY 8 |
#define | SLICES_MAX 128 |
#define | NBASE 5 |
Functions | |
void | AB_interp (int, double) |
void | Syntax (void) |
int | main (int argc, char *argv[]) |
Variables | |
MRI_IMAGE * | imin [SLICES_MAX] |
MRI_IMAGE * | zero_im |
double | gap [SLICES_MAX] |
double | zbot [SLICES_MAX] |
double | ztop [SLICES_MAX] |
double | dzin = 1.0 |
double | dzout = 0.0 |
double | gap_max |
double | gap_sum |
char | prefix [256] = "abut." |
int | interp = 0 |
int | verbose = 0 |
int | iout |
int | nfiles |
int | nx |
int | ny |
char | fname [256] |
Define Documentation
|
Definition at line 13 of file abut.c. Referenced by AB_interp(), and main(). |
|
Definition at line 12 of file abut.c. Referenced by AB_interp(), and main(). |
|
|
|
Definition at line 65 of file abut.c. Referenced by main(). |
Function Documentation
|
Definition at line 360 of file abut.c. References BLOCKY, fname, interp, iout, LINEAR, mri_data_pointer(), mri_free(), mri_new(), mri_write(), nfiles, nx, ny, zbot, and ztop. Referenced by main().
00361 { 00362 int nb , ii ; 00363 double wt , fnow,fnb; 00364 short * snow , * snb , * sint ; 00365 MRI_IMAGE * imint ; 00366 00367 if( interp != LINEAR && interp != BLOCKY ){ /* this is easy! */ 00368 mri_write( fname , imin[isl] ) ; 00369 if(verbose) 00370 printf(" -- new slice %d is a replica of input %d\n",iout,isl+1) ; 00371 return ; 00372 } 00373 00374 /* must deal with possibility of interpolation */ 00375 00376 /* possible to interpolate below? */ 00377 00378 if( zout-zbot[isl] <= 0.5 && /* closer to below */ 00379 isl > 0 && /* there is a below */ 00380 fabs(ztop[isl-1]-zbot[isl]) < 0.001 ){ /* below is adjacent */ 00381 00382 nb = isl-1 ; /* neighbor index */ 00383 wt = zout-zbot[isl] + 0.5 ; /* distance from below mid to zout */ 00384 00385 /* possible to interpolate above? */ 00386 00387 } else if( ztop[isl]-zout <= 0.5 && /* closer to above */ 00388 isl < nfiles-1 && /* there is an above */ 00389 fabs(zbot[isl+1]-ztop[isl]) < 0.001 ){ /* above is adjacent */ 00390 00391 nb = isl+1 ; /* neighbor index */ 00392 wt = ztop[isl]-zout + 0.5 ; /* distance from above mid to zout */ 00393 } else { 00394 mri_write( fname , imin[isl] ) ; /* no interp possible */ 00395 if(verbose) 00396 printf(" -- new slice %d is a replica of input %d\n",iout,isl+1) ; 00397 return ; 00398 } 00399 00400 snow = mri_data_pointer( imin[isl] ) ; 00401 snb = mri_data_pointer( imin[nb] ) ; 00402 imint = mri_new( nx , ny , MRI_short ) ; 00403 sint = mri_data_pointer( imint ) ; 00404 00405 if( interp == LINEAR ) fnow = wt ; /* linear */ 00406 else fnow = 1.0 - 8.0 * pow(1.0-wt,4.0) ; 00407 fnb = 1.0 - fnow ; 00408 00409 for( ii=0 ; ii < (nx*ny) ; ii++ ) 00410 sint[ii] = fnow * snow[ii] + fnb * snb[ii] ; 00411 00412 if(verbose) 00413 printf( 00414 " -- new slice %d interpolated from input %d(%6.3f) and %d(%6.3f)\n", 00415 iout , isl+1,fnow,nb+1,fnb ) ; 00416 00417 mri_write(fname,imint) ; 00418 mri_free(imint) ; 00419 return ; 00420 } |
|
force return of unscaled slices for output * Definition at line 78 of file abut.c. References AB_interp(), argc, BLOCKY, dzin, dzout, fit, fname, gap, gap_max, gap_sum, interp, iout, MRI_IMAGE::kind, LINEAR, machdep(), mri_data_pointer(), mri_new(), mri_read_just_one(), mri_write(), nfiles, MRI_IMAGE::nx, nx, MRI_IMAGE::ny, ny, prefix, SLICES_MAX, strtod(), Syntax(), verbose, zbot, and ztop.
00079 { 00080 int isl , nopt , ii ; 00081 double fff , zout ; 00082 short * zar ; 00083 00084 /*----- initialize -----*/ 00085 00086 if( argc < 3 || strncmp(argv[1],"-help",2) == 0 ) Syntax() ; 00087 00088 machdep() ; 00089 00090 for( isl=0 ; isl < SLICES_MAX ; isl++ ){ 00091 imin[isl] = NULL ; 00092 gap[isl] = 0.0 ; 00093 } 00094 00095 /*----- read command line options -----*/ 00096 00097 nopt = 1 ; 00098 00099 while( nopt < argc && argv[nopt][0] == '-' ){ 00100 00101 /*--- -verbose ---*/ 00102 00103 if( strncmp(argv[nopt],"-verbose",4) == 0 ){ 00104 verbose = 1 ; 00105 nopt++ ; continue ; 00106 } 00107 00108 /*--- -linear ---*/ 00109 00110 if( strncmp(argv[nopt],"-linear",4) == 0 ){ 00111 interp = LINEAR ; 00112 nopt++ ; continue ; 00113 } 00114 00115 /*--- -blocky ---*/ 00116 00117 if( strncmp(argv[nopt],"-blocky",4) == 0 ){ 00118 interp = BLOCKY ; 00119 nopt++ ; continue ; 00120 } 00121 00122 /*--- -dzin thickness ---*/ 00123 00124 if( strncmp(argv[nopt],"-dzin",4) == 0 ){ 00125 if( ++nopt >= argc ){ 00126 fprintf(stderr,"\n*** no argument for -dzin?\n\n") ; 00127 exit(1) ; 00128 } 00129 fff = strtod( argv[nopt] , NULL ) ; 00130 if( fff <= 0.0 ){ 00131 fprintf(stderr,"\n*** illegal argument for -dzin: %f\n\n",fff) ; 00132 exit(1) ; 00133 } 00134 dzin = fff ; 00135 nopt++ ; continue ; 00136 } 00137 00138 /*--- -dzout thickness ---*/ 00139 00140 if( strncmp(argv[nopt],"-dzout",4) == 0 ){ 00141 if( ++nopt >= argc ){ 00142 fprintf(stderr,"\n*** no argument for -dzout?\n\n") ; 00143 exit(1) ; 00144 } 00145 fff = strtod( argv[nopt] , NULL ) ; 00146 if( fff <= 0.0 ){ 00147 fprintf(stderr,"\n*** illegal argument for -dzout: %f\n\n",fff) ; 00148 exit(1) ; 00149 } 00150 dzout = fff ; 00151 nopt++ ; continue ; 00152 } 00153 00154 /*--- -root name ---*/ 00155 00156 if( strncmp(argv[nopt],"-root",4) == 0 ){ 00157 if( ++nopt >= argc ){ 00158 fprintf(stderr,"\n*** no argument for -root?\n\n") ; 00159 exit(1) ; 00160 } 00161 strcpy( prefix , argv[nopt] ) ; 00162 ii = strlen(prefix) ; 00163 if( prefix[ii-1] != '.' ){ /* add a period? */ 00164 prefix[ii] = '.' ; 00165 prefix[ii+1] = '\0' ; 00166 } 00167 nopt++ ; continue ; 00168 } 00169 00170 /*--- -skip n+gap ---*/ 00171 00172 if( strncmp(argv[nopt],"-skip",4) == 0 ){ 00173 int nok , nnn = -1 ; 00174 double ggg = -1.0 ; 00175 if( ++nopt >= argc ){ 00176 fprintf(stderr,"\n*** no argument for -skip?\n\n") ; 00177 exit(1) ; 00178 } 00179 00180 nok = sscanf( argv[nopt] , "%d+%lf" , &nnn , &ggg ) ; 00181 00182 if( nok != 2 || nnn <= 0 || nnn > SLICES_MAX || ggg < 0 ){ 00183 fprintf(stderr, 00184 "\n*** illegal argument for -skip: %s\n\n",argv[nopt]) ; 00185 exit(1) ; 00186 } 00187 00188 gap[nnn-1] = ggg ; /* external slice indices are 1 more */ 00189 nopt++ ; continue ; /* than the internal index system! */ 00190 } 00191 } 00192 00193 /*----- read input images -----*/ 00194 00195 if( nopt >= argc ){ 00196 fprintf(stderr,"\n*** no input image files!!!\n\n") ; 00197 exit(1) ; 00198 } 00199 00200 nfiles = argc - nopt ; 00201 if( nfiles > SLICES_MAX ){ 00202 fprintf(stderr, 00203 "\n*** You input %d files, but max allowed is %d!!!\n\n" , 00204 nfiles , SLICES_MAX ) ; 00205 exit(1) ; 00206 } else if( nfiles < 1 ){ 00207 fprintf(stderr,"\n*** no input image files!!!\n\n") ; 00208 exit(1) ; 00209 } else if( nfiles == 1 ){ 00210 fprintf(stderr,"\n*** only one input image file!!!\n\n") ; 00211 exit(1) ; 00212 } 00213 00214 imin[0] = mri_read_just_one( argv[nopt] ) ; 00215 if( imin[0] == NULL ){ 00216 fprintf(stderr,"\n*** Cannot read 1st image from file %s\n",argv[nopt]); 00217 exit(1) ; 00218 } 00219 if( imin[0]->kind != MRI_short ){ 00220 fprintf(stderr,"\n*** Cannot deal with non-short images!\n") ; 00221 exit(1) ; 00222 } 00223 nx = imin[0]->nx ; ny = imin[0]->ny ; 00224 00225 for( isl=1 ; isl < nfiles ; isl++ ){ 00226 imin[isl] = mri_read_just_one( argv[nopt+isl] ) ; 00227 if( imin[isl] == NULL ){ 00228 fprintf(stderr,"\n*** Cannot read 1st image from file %s\n",argv[nopt+isl]) ; 00229 exit(1) ; 00230 } 00231 00232 if( imin[isl]->nx != nx || imin[isl]->ny != ny ){ 00233 fprintf(stderr, 00234 "\n*** first file is %d x %d but file %s is %d x %d!\n\n", 00235 nx,ny , argv[nopt+isl] , imin[isl]->nx , imin[isl]->ny ) ; 00236 exit(1) ; 00237 } 00238 00239 if( imin[isl]->kind != MRI_short ){ 00240 fprintf(stderr, 00241 "\n*** image file %s is not an image of shorts!\n", 00242 argv[nopt+isl] ) ; 00243 exit(1) ; 00244 } 00245 } /* all images input when this loop exits */ 00246 00247 zero_im = mri_new( nx , ny , MRI_short ) ; 00248 zar = mri_data_pointer( zero_im ) ; 00249 for( ii=0 ; ii < (nx*ny) ; ii++ ) zar[ii] = 0 ; 00250 00251 /*----- adjust gaps to be relative to dzin -----*/ 00252 00253 gap_max = 0 ; 00254 for( isl=0 ; isl < nfiles-1 ; isl++ ){ 00255 gap[isl] = gap[isl] / dzin ; 00256 gap_max = (gap_max < gap[isl]) ? (gap[isl]) : (gap_max) ; 00257 } 00258 00259 /*----- compute dzout (relative to dzin) if not already given -----*/ 00260 00261 if( dzout > 0.0 ){ 00262 dzout = dzout / dzin ; 00263 } else if( gap_max == 0.0 ){ 00264 dzout = 1.0 ; 00265 } else { 00266 #define NBASE 5 00267 int ibase , ibest ; 00268 double fit , worst_fit[NBASE+1]; 00269 00270 for( ibase=1 ; ibase <= NBASE ; ibase++ ){ /* find worst error */ 00271 worst_fit[ibase] = 0.0 ; /* for dzout = 1/ibase */ 00272 00273 for( isl=0 ; isl < nfiles-1 ; isl++ ){ 00274 if( gap[isl] > 0.0 ){ 00275 fit = gap[isl] * ibase ; 00276 fit = fabs( fit - floor(fit+0.5) ) ; 00277 if( fit > worst_fit[ibase] ) worst_fit[ibase] = fit ; 00278 } 00279 } 00280 } 00281 00282 for( ibase=1 ; ibase <= NBASE ; ibase++ ) 00283 if( worst_fit[ibase] < 0.05 ) break ; /* first one < 5% */ 00284 00285 ibest = ibase ; 00286 if( ibest > NBASE ){ /* otherwise take best */ 00287 fit = worst_fit[1] ; 00288 ibest = 1 ; 00289 for( ibase=2 ; ibase <= NBASE ; ibase++ ) 00290 if( worst_fit[ibase] < fit ){ 00291 ibest = ibase ; 00292 fit = worst_fit[ibase] ; 00293 } 00294 } 00295 00296 dzout = ((double) 1.0) / (double) ibest ; 00297 00298 printf("-- computed dzout = %f\n" , dzout * dzin ) ; 00299 } 00300 00301 /*----- adjust gaps to be integer multiples of dzout -----*/ 00302 00303 for( isl=0 ; isl < nfiles-1 ; isl++ ){ 00304 00305 fff = gap[isl] ; 00306 iout = (int)( fff / dzout + 0.5 ) ; 00307 gap[isl] = iout * dzout ; 00308 00309 if( fabs(gap[isl]-fff) > 0.001 ) 00310 printf("-- adjusted gap after slice %d to %f\n", 00311 isl+1 , gap[isl]*dzin ) ; 00312 } 00313 00314 /*----- loop through output points and output stuff -----*/ 00315 00316 isl = 0 ; 00317 zout = 0 ; 00318 00319 gap_sum = 0.0 ; 00320 for( isl=0 ; isl < nfiles ; isl++ ){ 00321 zbot[isl] = zout ; 00322 ztop[isl] = zout + 1.0 ; 00323 zout += 1.0 + gap[isl] ; /* start of next slice */ 00324 } 00325 00326 zout = 0.001 ; 00327 iout = 0 ; 00328 isl = 0 ; 00329 00330 do { 00331 00332 iout++ ; 00333 sprintf(fname,"%s%04d",prefix,iout) ; 00334 00335 if( zout >= zbot[isl] && zout < ztop[isl] ){ /* inside this slice */ 00336 AB_interp( isl , zout ) ; 00337 continue ; 00338 } 00339 00340 if( zout >= ztop[isl] ){ /* move to next slice */ 00341 isl++ ; 00342 } 00343 00344 if( zout < zbot[isl] ){ /* before slice ==> in a gap */ 00345 mri_write( fname , zero_im ) ; 00346 if(verbose) printf(" -- new slice %d is all zeros\n",iout) ; 00347 continue ; 00348 } 00349 00350 AB_interp( isl , zout ) ; /* into the next slice now */ 00351 00352 } while ( (zout += dzout) < ztop[nfiles-1] ) ; 00353 00354 /*----- DONE -----*/ 00355 00356 printf("-- wrote %d output slices\n",iout) ; 00357 exit(0) ; 00358 } |
|
31 July 1996: be more specific about errors * Definition at line 15 of file abut.c.
00016 { 00017 printf( 00018 "ABUT: put noncontiguous FMRI slices together [for to3d]\n" 00019 "\n" 00020 "method: put zero valued slices in the gaps, then\n" 00021 " replicate images to simulate thinner slices\n" 00022 "\n" 00023 "Usage:\n" 00024 " abut [-dzin thickness] [-dzout thickness] [-root name]\n" 00025 " [-linear | -blocky] [-verbose] [-skip n+gap] ... images ...\n" 00026 "\n" 00027 " -dzin the thickness value in mm; if not given,\n" 00028 " taken to be 1.0 (in which case, the output\n" 00029 " thickness and gap sizes are simply relative\n" 00030 " to the slice thickness, rather than absolute)\n" 00031 "\n" 00032 " -dzout the output slice thickness, usually smaller than\n" 00033 " the input thickness; if not given, the program\n" 00034 " will compute a value (the smaller the ratio\n" 00035 " dzout/dzin is, the more slices will be output)\n" 00036 "\n" 00037 " -root 'name' is the root (or prefix) for the output\n" 00038 " slice filename; for example, '-root fred.'\n" 00039 " will result in files fred.0001, fred.0002, ...\n" 00040 "\n" 00041 " -linear if present, this flag indicates that subdivided slices\n" 00042 " will be linearly interpolated rather than simply\n" 00043 " replicated -- this will make the results smoother\n" 00044 " in the through-slice direction (if dzout < dzin)\n" 00045 "\n" 00046 " -blocky similar to -linear, but uses AFNI's 'blocky' interpolation\n" 00047 " when possible to put out intermediate slices.\n" 00048 " Both interpolation options only apply when dzout < dzin\n" 00049 " and when an output slice has a non-gappy neighbor.\n" 00050 "\n" 00051 " -skip 'n+gap' indicates that a gap is to be inserted\n" 00052 " between input slices #n and #n+1, where n=1,2,...;\n" 00053 " for example, -skip 6+5.5 means put a gap of 5.5 mm\n" 00054 " between slices 6 and 7.\n" 00055 "\n" 00056 " More than one -skip option is allowed. They must all occur\n" 00057 " before the list of input image filenames.\n" 00058 ) ; 00059 00060 exit(0) ; 00061 } |
Variable Documentation
|
Definition at line 71 of file abut.c. Referenced by main(). |
|
Definition at line 71 of file abut.c. Referenced by main(). |
|
Definition at line 76 of file abut.c. Referenced by AB_interp(), and main(). |
|
Definition at line 68 of file abut.c. Referenced by main(). |
|
Definition at line 71 of file abut.c. Referenced by main(). |
|
Definition at line 71 of file abut.c. Referenced by main(). |
|
|
|
Definition at line 73 of file abut.c. Referenced by AB_interp(), and main(). |
|
Definition at line 75 of file abut.c. Referenced by AB_interp(), and main(). |
|
Definition at line 75 of file abut.c. Referenced by AB_interp(), and main(). |
|
Definition at line 75 of file abut.c. Referenced by AB_interp(), and main(). |
|
Definition at line 75 of file abut.c. Referenced by AB_interp(), and main(). |
|
Definition at line 72 of file abut.c. Referenced by main(). |
|
Definition at line 74 of file abut.c. Referenced by main(). |
|
Definition at line 69 of file abut.c. Referenced by AB_interp(), and main(). |
|
|
|
Definition at line 69 of file abut.c. Referenced by AB_interp(), and main(). |