deepmr.io.write_image#
- deepmr.io.write_image(filename, image, head=None, dataformat='nifti', filepath='./', series_description='', series_number_offset=0, series_number_scale=1000, rescale=False, anonymize=False, verbose=False)[source]#
Write image to disk.
- Parameters:
filename (str) – Name of the file.
image (np.ndarray) – Complex image data of shape
(ncontrasts, nslices, ny, n). See'Notes'for additional information.head (Header, optional) – Structure containing trajectory of shape
(ncontrasts, nviews, npts, ndim)and meta information (shape, resolution, spacing, etc). If None, assume 1mm isotropic resolution, contiguous slices and axial orientation. The default is None.dataformat (str, optional) – Available formats (
dicomornifti). The default isnifti.filepath (str, optional) – Path to file. The default is
./.series_description (str, optional) – Custom series description. The default is
""(empty string).series_number_offset (int, optional) – Series number offset with respect to the acquired one. Final series number is
series_number_scale * acquired_series_number + series_number_offset. he default is0.series_number_scale (int, optional) – Series number multiplicative scaling with respect to the acquired one. Final series number is
series_number_scale * acquired_series_number + series_number_offset. The default is1000.rescale (bool, optional) – If true, rescale image intensity between
0andint16_max. Beware! Avoid this if you are working with quantitative maps. The default isFalse.anonymize (bool, optional) – If True, remove sensible info from header. The default is
False.verbose (bool, optional) – Verbosity flag. The default is
False.
Example
>>> import deepmr >>> import tempfile
Get the filenames for an example DICOM file.
>>> filepath = deepmr.testdata("dicom")
Load the file contents.
>>> image_orig, head_orig = deepmr.io.read_image(filepath) >>> with tempfile.TemporaryDirectory() as tempdir: >>> dcmpath = os.path.join(tempdir, "dicomtest") >>> niftipath = os.path.join(tempdir, "niftitest.nii") >>> deepmr.io.write_image(dcmpath, image_orig, head_orig, dataformat="dicom") >>> deepmr.io.write_image(niftipath, image_orig, head_orig, dataformat="nifti") >>> deepmr.io.write_image(dcmpath, image_orig, head_orig, dataformat="dicom") >>> deepmr.io.write_image(niftipath, image_orig, head_orig, dataformat="nifti") >>> image_dcm, head_dcm = deepmr.io.read_image(dcmpath) >>> image_nii, head_nii = deepmr.io.read_image(niftipath)
The result is a image/header pair.
Imagecontains image-space data. Here, it represents a 2D cartesian acquisition with 3 echoes, 2 slices and 192x192 matrix size.>>> image_dcm.shape torch.Size([3, 2, 192, 192]) >>> image_nii.shape torch.Size([3, 2, 192, 192])
Headcontains the acquisition information. We can inspect the image shape and resolution:>>> head_dcm.shape tensor([ 2, 192, 192]) >>> head_nii.shape tensor([ 2, 192, 192]) >>> head_dcm.ref_dicom.SpacingBetweenSlices '10.5' >>> head_nii.ref_dicom.SpacingBetweenSlices '10.5' >>> head_dcm.ref_dicom.SliceThickness '7.0' >>> head_nii.ref_dicom.SliceThickness '7.0' >>> head_dcm.ref_dicom.PixelSpacing [0.67, 0.67] >>> head_nii.ref_dicom.PixelSpacing [0.67,0.67]
Headalso contains contrast information (for forward simulation and parameter inference):>>> head_dcm.FA 180.0 >>> head_nii.FA 180.0 >>> head_dcm.TE tensor([ 20.0, 40.0, 60.0]) >>> head_nii.TE tensor([ 20.0, 40.0, 60.0]) >>> head_dcm.TR 3000.0 >>> head_nii.TR 3000.0
Notes
When the image to be written is the result of a reconstruction performed on k-space data loaded using
deepmr.io.read_rawdata(), axis order depends on acquisition mode:2Dcart:
(nslices, ncontrasts, ny, nx)2Dnoncart:
(nslices, ncontrasts, ny, nx)3Dcart:
(ncontrasts, nz, ny, nx)3Dnoncart:
(nx, ncontrasts, nz, ny)
In this case, image should be transposed to
(ncontrasts, nslices, ny, nx)or(ncontrasts, nz, ny, nx)for 2D/3D acquisitions, respectively. If provided,headwill contain the appropriate permutation order (head.transpose()):2Dcart:
head.transpose = [1, 0, 2, 3]2Dnoncart:
head.transpose = [1, 0, 2, 3]3Dcart:
head.transpose = [0, 1, 2, 3]3Dnoncart:
head.transpose = [1, 2, 3, 0]
If
headis not provided, the user shoudl manually transpose the image tensor to match the required shape.