|
1 | 1 | """Image tools interfaces."""
|
2 |
| -import numpy as np |
3 |
| -import nibabel as nb |
4 |
| -from nipype.utils.filemanip import fname_presuffix |
5 | 2 | from nipype import logging
|
6 | 3 | from nipype.interfaces.base import (
|
7 | 4 | traits, TraitedSpec, BaseInterfaceInputSpec, SimpleInterface, File
|
8 | 5 | )
|
9 | 6 |
|
| 7 | +from dmriprep.utils.images import extract_b0, rescale_b0, median |
| 8 | + |
10 | 9 | LOGGER = logging.getLogger('nipype.interface')
|
11 | 10 |
|
12 | 11 |
|
@@ -45,24 +44,6 @@ def _run_interface(self, runtime):
|
45 | 44 | return runtime
|
46 | 45 |
|
47 | 46 |
|
48 |
| -def extract_b0(in_file, b0_ixs, newpath=None): |
49 |
| - """Extract the *b0* volumes from a DWI dataset.""" |
50 |
| - out_file = fname_presuffix( |
51 |
| - in_file, suffix='_b0', newpath=newpath) |
52 |
| - |
53 |
| - img = nb.load(in_file) |
54 |
| - data = img.get_fdata(dtype='float32') |
55 |
| - |
56 |
| - b0 = data[..., b0_ixs] |
57 |
| - |
58 |
| - hdr = img.header.copy() |
59 |
| - hdr.set_data_shape(b0.shape) |
60 |
| - hdr.set_xyzt_units('mm') |
61 |
| - hdr.set_data_dtype(np.float32) |
62 |
| - nb.Nifti1Image(b0, img.affine, hdr).to_filename(out_file) |
63 |
| - return out_file |
64 |
| - |
65 |
| - |
66 | 47 | class _RescaleB0InputSpec(BaseInterfaceInputSpec):
|
67 | 48 | in_file = File(exists=True, mandatory=True, desc='b0s file')
|
68 | 49 | mask_file = File(exists=True, mandatory=True, desc='mask file')
|
@@ -101,45 +82,3 @@ def _run_interface(self, runtime):
|
101 | 82 | newpath=runtime.cwd
|
102 | 83 | )
|
103 | 84 | return runtime
|
104 |
| - |
105 |
| - |
106 |
| -def rescale_b0(in_file, mask_file, newpath=None): |
107 |
| - """Rescale the input volumes using the median signal intensity.""" |
108 |
| - out_file = fname_presuffix( |
109 |
| - in_file, suffix='_rescaled_b0', newpath=newpath) |
110 |
| - |
111 |
| - img = nb.load(in_file) |
112 |
| - if img.dataobj.ndim == 3: |
113 |
| - return in_file |
114 |
| - |
115 |
| - data = img.get_fdata(dtype='float32') |
116 |
| - mask_img = nb.load(mask_file) |
117 |
| - mask_data = mask_img.get_fdata(dtype='float32') |
118 |
| - |
119 |
| - median_signal = np.median(data[mask_data > 0, ...], axis=0) |
120 |
| - rescaled_data = 1000 * data / median_signal |
121 |
| - hdr = img.header.copy() |
122 |
| - nb.Nifti1Image(rescaled_data, img.affine, hdr).to_filename(out_file) |
123 |
| - return out_file |
124 |
| - |
125 |
| - |
126 |
| -def median(in_file, newpath=None): |
127 |
| - """Average a 4D dataset across the last dimension using median.""" |
128 |
| - out_file = fname_presuffix( |
129 |
| - in_file, suffix='_b0ref', newpath=newpath) |
130 |
| - |
131 |
| - img = nb.load(in_file) |
132 |
| - if img.dataobj.ndim == 3: |
133 |
| - return in_file |
134 |
| - if img.shape[-1] == 1: |
135 |
| - nb.squeeze_image(img).to_filename(out_file) |
136 |
| - return out_file |
137 |
| - |
138 |
| - median_data = np.median(img.get_fdata(dtype='float32'), |
139 |
| - axis=-1) |
140 |
| - |
141 |
| - hdr = img.header.copy() |
142 |
| - hdr.set_xyzt_units('mm') |
143 |
| - hdr.set_data_dtype(np.float32) |
144 |
| - nb.Nifti1Image(median_data, img.affine, hdr).to_filename(out_file) |
145 |
| - return out_file |
0 commit comments