1 #include "mrilib.h"
2 
3 /*------------------------------------------------------------------------*/
4 /*! Return 1 if an image is all zero (or NULL),
5     or return 0 if it is not all zero (bytewise) */
6 
mri_allzero(MRI_IMAGE * im)7 int mri_allzero( MRI_IMAGE *im )
8 {
9    char *ar ; unsigned int ii , nch ;
10 
11    if( im == NULL ) return 1 ;
12    ar = mri_data_pointer(im) ; if( ar == NULL ) return 1 ;
13    nch = (unsigned int)im->nvox * (unsigned int)im->pixel_size ;
14    for( ii=0 ; ii < nch ; ii++ ) if( ar[ii] != 0 ) return 0 ;
15    return 1 ;
16 }
17 
18 /*------------------------------------------------------------------------*/
19 /*! Return count of nonzero voxels. */
20 
mri_nonzero_count(MRI_IMAGE * im)21 int mri_nonzero_count( MRI_IMAGE *im )
22 {
23    MRI_IMAGE *fim ; float *far ;
24    int ii , nvox , nnz ;
25 
26    if( mri_allzero(im) ) return 0 ;
27 
28    if( im->kind == MRI_float ) fim = im ;
29    else                        fim = mri_to_float(im) ;
30    far = MRI_FLOAT_PTR(fim) ;
31    nvox = fim->nvox ;
32    for( nnz=ii=0 ; ii < nvox ; ii++ ) if( far[ii] != 0.0f ) nnz++ ;
33    if( fim != im ) mri_free(fim) ;
34    return nnz ;
35 }
36 
37 /*------------------------------------------------------------------------*/
38 /*! Return count of nonzero voxels in a mask [12 Dec 2019] */
39 
mri_nonzero_count_inmask(MRI_IMAGE * im,byte * mmm)40 int mri_nonzero_count_inmask( MRI_IMAGE *im , byte *mmm )
41 {
42    MRI_IMAGE *fim ; float *far ;
43    int ii , nvox , nnz ;
44 
45    if( mri_allzero(im) ) return 0 ;
46    if( mmm == NULL     ) return mri_nonzero_count(im) ;
47 
48    if( im->kind == MRI_float ) fim = im ;
49    else                        fim = mri_to_float(im) ;
50    far = MRI_FLOAT_PTR(fim) ;
51    nvox = fim->nvox ;
52    for( nnz=ii=0 ; ii < nvox ; ii++ )
53      if( mmm[ii] && far[ii] != 0.0f ) nnz++ ;
54 
55    if( fim != im ) mri_free(fim) ;
56    return nnz ;
57 }
58