Skip to content

Commit ff8e2b7

Browse files
committed
fix: implement a bilateral scaling around the mode, better recentering
1 parent 3050a54 commit ff8e2b7

File tree

2 files changed

+20
-16
lines changed

2 files changed

+20
-16
lines changed

sdcflows/interfaces/fmap.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -565,17 +565,28 @@ def _delta_te(in_values, te1=None, te2=None):
565565

566566
def au2rads(in_file, newpath=None):
567567
"""Convert the input phase difference map in arbitrary units (a.u.) to rads."""
568+
from scipy.stats import mode
568569
im = nb.load(in_file)
569570
data = im.get_fdata(dtype='float32')
570571
hdr = im.header.copy()
571572

572-
data -= np.percentile(data, 2)
573-
data[data < 0] = 0
574-
data = 2.0 * np.pi * data / np.percentile(data, 98)
575-
data[data > 2.0 * np.pi] = 2.0 * np.pi
573+
# First center data around 0.0.
574+
data -= mode(data, axis=None)[0][0]
575+
576+
# Scale lower tail
577+
data[data < 0] = - np.pi * data[data < 0] / np.percentile(data[data < 0], 2)
578+
579+
# Scale upper tail
580+
data[data > 0] = np.pi * data[data > 0] / np.percentile(data[data > 0], 98)
581+
582+
# Offset to 0 - 2pi
583+
data += np.pi
584+
585+
# Clip
586+
data = np.clip(data, 0.0, 2 * np.pi)
587+
576588
hdr.set_data_dtype(np.float32)
577589
hdr.set_xyzt_units('mm')
578-
579590
out_file = fname_presuffix(in_file, suffix='_rads', newpath=newpath)
580591
nb.Nifti1Image(data, im.affine, hdr).to_filename(out_file)
581592
return out_file

sdcflows/workflows/phdiff.py

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,6 @@ def init_phdiff_wf(omp_nthreads, name='phdiff_wf'):
141141
(inputnode, phmap2rads, [('phasediff', 'in_file')]),
142142
(phmap2rads, prelude, [('out_file', 'phase_file')]),
143143
(prelude, recenter, [('unwrapped_phase_file', 'in_file')]),
144-
(bet, recenter, [('mask_file', 'in_mask')]),
145144
(recenter, denoise, [('out', 'in_file')]),
146145
(denoise, demean, [('out_file', 'in_file')]),
147146
(demean, cleanup_wf, [('out', 'inputnode.in_file')]),
@@ -155,24 +154,18 @@ def init_phdiff_wf(omp_nthreads, name='phdiff_wf'):
155154
return workflow
156155

157156

158-
def _recenter(in_file, in_mask=None, offset=None):
157+
def _recenter(in_file):
159158
"""Recenter the phase-map distribution to the -pi..pi range."""
160159
from os import getcwd
161160
import numpy as np
162161
import nibabel as nb
163162
from nipype.utils.filemanip import fname_presuffix
164163

165-
if offset is None:
166-
offset = np.pi
167-
168164
nii = nb.load(in_file)
169165
data = nii.get_fdata(dtype='float32')
170-
171-
msk = data > 1.e-6
172-
if in_mask is not None:
173-
msk = nb.load(in_mask).get_fdata(dtype='float32') > 1.e-4
174-
175-
data[msk] -= offset
166+
msk = data != 0
167+
msk[data == 0] = False
168+
data[msk] -= np.median(data[msk])
176169

177170
out_file = fname_presuffix(in_file, suffix='_recentered',
178171
newpath=getcwd())

0 commit comments

Comments
 (0)