1313import numpy as np
1414from nibabel .imageclasses import spatial_axes_first
1515
16+ def count_nonzero_voxels (img ):
17+ """
18+ Count number of non-zero voxels
19+ Parameters
20+ ----------
21+ img : ``SpatialImage``
22+ All voxels of the mask should be of value 1, background should have value 0.
23+
24+ Returns
25+ -------
26+ non zero voxel volume: int
27+ Number of non-zero voxels
28+
29+ """
30+ return np .count_nonzero (img .dataobj )
1631
17- def mask_volume (img , units = 'mm3' ):
32+ def mask_volume (img ):
1833 """ Compute volume of mask image.
1934 Equivalent to "fslstats /path/file.nii -V"
2035
@@ -23,36 +38,24 @@ def mask_volume(img, units='mm3'):
2338 img : ``SpatialImage``
2439 All voxels of the mask should be of value 1, background should have value 0.
2540
26- units : string {"mm3", "vox"}, optional
27- Unit of the returned mask volume. Defaults to "mm3".
2841
2942 Returns
3043 -------
31- mask_volume_vx: float
32- Volume of mask expressed in voxels.
33-
34- or
35-
3644 mask_volume_mm3: float
3745 Volume of mask expressed in mm3.
3846
3947 Examples
4048 --------
41- >>> import nibabel as nf
42- >>> path = 'path/to/nifti/mask.nii'
43- >>> img = nf.load(path) # path is contains a path to an example nifti mask
44- >>> mask_volume(img )
45- 50.3021
49+ >>> import nibabel as nb
50+ >>> mask_data = np.zeros((20, 20, 20), dtype='u1')
51+ >>> mask_data[5:15, 5:15, 5:15] = 1
52+ >>> nb.imagestats. mask_volume(nb.Nifti1Image(mask_data, np.eye(4) )
53+ 1000.0
4654 """
4755 if not spatial_axes_first (img ):
4856 raise ValueError ("Cannot calculate voxel volume for image with unknown spatial axes" )
4957 voxel_volume_mm3 = np .prod (img .header .get_zooms ()[:3 ])
50- mask_volume_vx = np . count_nonzero (img . dataobj )
58+ mask_volume_vx = count_nonzero_voxels (img )
5159 mask_volume_mm3 = mask_volume_vx * voxel_volume_mm3
5260
53- if units == 'vox' :
54- return mask_volume_vx
55- elif units == 'mm3' :
56- return mask_volume_mm3
57- else :
58- raise ValueError (f'{ units } is not a valid unit. Choose "mm3" or "vox".' )
61+ return mask_volume_mm3
0 commit comments