1 #include "mrilib.h"
2 
3 #undef  GOOD
4 #define GOOD(i) ( bmmm == mask[i] )
5 
6 /*----------------------------------------------------------------------------*/
7 
binarize_mask(int nvox,byte * mask)8 void binarize_mask( int nvox , byte *mask )
9 {
10    register int ii ;
11    if( nvox <= 0 || mask == NULL ) return ;
12    for( ii=0 ; ii < nvox ; ii++ ) if( mask[ii] ) mask[ii] = 1 ;
13    return ;
14 }
15 
16 /*----------------------------------------------------------------------------*/
17 /* Extract (into a 1D float image) the values inside the mask.
18    If invert is nonzero, means to extract all values where mask=0.
19 *//*--------------------------------------------------------------------------*/
20 
mri_extract_from_mask(MRI_IMAGE * imin,byte * mask,int invert)21 MRI_IMAGE * mri_extract_from_mask( MRI_IMAGE *imin , byte *mask , int invert )
22 {
23    byte bmmm = (invert == 0) ? 1 : 0 ;
24    int ii,jj , ngood , nvox ;
25    float *iar , *oar ;
26    MRI_IMAGE *outim ;
27 
28 ENTRY("mri_extract_mask") ;
29 
30    if( imin == NULL || mask == NULL ) RETURN(NULL) ;  /* bad user == luser */
31 
32    /*-- not float?  create a float image and recurse! --*/
33 
34    if( imin->kind != MRI_float ){
35      MRI_IMAGE *qim = mri_to_float(imin) ;
36      outim = mri_extract_from_mask( qim , mask , invert ) ;
37      mri_free(qim) ;
38      RETURN(outim) ;
39    }
40 
41    /*-- count up the good voxels --*/
42 
43    nvox = imin->nvox ;
44    for( ngood=ii=0 ; ii < nvox ; ii++ ) if( GOOD(ii) ) ngood++ ;
45    if( ngood == 0 ) RETURN(NULL) ;
46 
47    /*-- create the output --*/
48 
49    outim = mri_new( ngood , 1 , MRI_float ) ;
50    oar   = MRI_FLOAT_PTR(outim) ;
51    iar   = MRI_FLOAT_PTR(imin) ;
52 
53    /*-- fill the output --*/
54 
55    for( jj=ii=0 ; ii < nvox ; ii++ ) if( GOOD(ii) ) oar[jj++] = iar[ii] ;
56 
57    RETURN(outim) ;
58 }
59