Source code for dipy.io.image
import nibabel as nib
import numpy as np
from packaging.version import Version
from dipy.testing.decorators import warning_for_keywords
[docs]
@warning_for_keywords()
def load_nifti_data(fname, *, as_ndarray=True):
"""Load only the data array from a nifti file.
Parameters
----------
fname : str
Full path to the file.
as_ndarray: bool, optional
convert nibabel ArrayProxy to a numpy.ndarray.
If you want to save memory and delay this casting, just turn this
option to False.
Returns
-------
data: np.ndarray or nib.ArrayProxy
See Also
--------
load_nifti
"""
img = nib.load(fname)
return np.asanyarray(img.dataobj) if as_ndarray else img.dataobj
[docs]
@warning_for_keywords()
def load_nifti(
fname,
*,
return_img=False,
return_voxsize=False,
return_coords=False,
as_ndarray=True,
):
"""Load data and other information from a nifti file.
Parameters
----------
fname : str
Full path to a nifti file.
return_img : bool, optional
Whether to return the nibabel nifti img object.
return_voxsize: bool, optional
Whether to return the nifti header zooms.
return_coords : bool, optional
Whether to return the nifti header aff2axcodes.
as_ndarray: bool, optional
convert nibabel ArrayProxy to a numpy.ndarray.
If you want to save memory and delay this casting, just turn this
option to False.
Returns
-------
A tuple, with (at the most, if all keyword args are set to True):
(data, img.affine, img, vox_size, nib.aff2axcodes(img.affine))
See Also
--------
load_nifti_data
"""
img = nib.load(fname)
data = np.asanyarray(img.dataobj) if as_ndarray else img.dataobj
vox_size = img.header.get_zooms()[:3]
ret_val = [data, img.affine]
if return_img:
ret_val.append(img)
if return_voxsize:
ret_val.append(vox_size)
if return_coords:
ret_val.append(nib.aff2axcodes(img.affine))
return tuple(ret_val)
[docs]
@warning_for_keywords()
def save_nifti(fname, data, affine, *, hdr=None, dtype=None):
"""Save a data array into a nifti file.
Parameters
----------
fname : str
The full path to the file to be saved.
data : ndarray
The array with the data to save.
affine : 4x4 array
The affine transform associated with the file.
hdr : nifti header, optional
May contain additional information to store in the file header.
Returns
-------
None
"""
NIBABEL_4_0_0_PLUS = Version(nib.__version__) >= Version("4.0.0")
# See GitHub issues
# * https://github.com/nipy/nibabel/issues/1046
# * https://github.com/nipy/nibabel/issues/1089
# This only applies to NIfTI because the parent Analyze formats did
# not support 64-bit integer data, so `set_data_dtype(int64)` would
# already fail.
danger_dts = (np.dtype("int64"), np.dtype("uint64"))
if (
hdr is None
and dtype is None
and data.dtype in danger_dts
and NIBABEL_4_0_0_PLUS
):
msg = f"Image data has type {data.dtype}, which may cause "
msg += "incompatibilities with other tools. Indeed, Analyze formats "
msg += "did not support 64-bit integer data.\n\n"
msg += "To silent this, please specify the `header` or `dtype` "
msg += "You could also use `np.asarray(data, dtype=np.int32)`. "
msg += "This cast will make sure that you data is compatible with "
msg += "other software."
raise ValueError(msg)
kwargs = {"dtype": dtype} if NIBABEL_4_0_0_PLUS else {}
result_img = nib.Nifti1Image(data, affine, header=hdr, **kwargs)
result_img.to_filename(fname)
[docs]
def save_qa_metric(fname, xopt, fopt):
"""Save Quality Assurance metrics.
Parameters
----------
fname: string
File name to save the metric values.
xopt: numpy array
The metric containing the
optimal parameters for
image registration.
fopt: int
The distance between the registered images.
"""
np.savetxt(fname, xopt, header="Optimal Parameter metric")
with open(fname, "a") as f:
f.write("# Distance after registration\n")
f.write(str(fopt))