|
19 | 19 |
|
20 | 20 | from nipype.interfaces import ants, fsl, utility as niu
|
21 | 21 | from nipype.pipeline import engine as pe
|
22 |
| -from niflow.nipype1.workflows.dmri.fsl.utils import ( |
23 |
| - demean_image, cleanup_edge_pipeline) |
| 22 | +from niflow.nipype1.workflows.dmri.fsl.utils import cleanup_edge_pipeline |
24 | 23 | from niworkflows.engine.workflows import LiterateWorkflow as Workflow
|
25 | 24 | from niworkflows.interfaces.images import IntraModalMerge
|
26 | 25 | from niworkflows.interfaces.masks import BETRPT
|
@@ -125,7 +124,7 @@ def init_phdiff_wf(omp_nthreads, name='phdiff_wf'):
|
125 | 124 | denoise = pe.Node(fsl.SpatialFilter(operation='median', kernel_shape='sphere',
|
126 | 125 | kernel_size=3), name='denoise')
|
127 | 126 |
|
128 |
| - demean = pe.Node(niu.Function(function=demean_image), name='demean') |
| 127 | + demean = pe.Node(niu.Function(function=_demean), name='demean') |
129 | 128 |
|
130 | 129 | cleanup_wf = cleanup_edge_pipeline(name="cleanup_wf")
|
131 | 130 |
|
@@ -171,3 +170,38 @@ def _recenter(in_file):
|
171 | 170 | newpath=getcwd())
|
172 | 171 | nb.Nifti1Image(data, nii.affine, nii.header).to_filename(out_file)
|
173 | 172 | return out_file
|
| 173 | + |
| 174 | + |
| 175 | +def _demean(in_file, in_mask=None, usemode=True): |
| 176 | + """ |
| 177 | + Subtract the median (since it is robuster than the mean) from a map. |
| 178 | +
|
| 179 | + Parameters |
| 180 | + ---------- |
| 181 | + usemode : bool |
| 182 | + Use the mode instead of the median (should be even more robust |
| 183 | + against outliers). |
| 184 | +
|
| 185 | + """ |
| 186 | + from os import getcwd |
| 187 | + import numpy as np |
| 188 | + import nibabel as nb |
| 189 | + from nipype.utils.filemanip import fname_presuffix |
| 190 | + |
| 191 | + nii = nb.load(in_file) |
| 192 | + data = nii.get_fdata(dtype='float32') |
| 193 | + |
| 194 | + msk = np.ones_like(data, dtype=bool) |
| 195 | + if in_mask is not None: |
| 196 | + msk[nb.load(in_mask).get_fdata(dtype='float32') < 1e-4] = False |
| 197 | + |
| 198 | + if usemode: |
| 199 | + from scipy.stats import mode |
| 200 | + data[msk] -= mode(data[msk], axis=None)[0][0] |
| 201 | + else: |
| 202 | + data[msk] -= np.median(data[msk], axis=None) |
| 203 | + |
| 204 | + out_file = fname_presuffix(in_file, suffix='_demean', |
| 205 | + newpath=getcwd()) |
| 206 | + nb.Nifti1Image(data, nii.affine, nii.header).to_filename(out_file) |
| 207 | + return out_file |
0 commit comments