Skip to content

Commit f310067

Browse files
Keep gcc by indexes (#309)
allow to get rid off external (disconnected) components by tissues
1 parent 38d6356 commit f310067

2 files changed

Lines changed: 63 additions & 10 deletions

File tree

macapype/nodes/surface.py

Lines changed: 50 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,24 @@
44
from nipype.interfaces.afni.base import AFNICommandBase
55

66

7+
def getLargestCC(segmentation):
8+
9+
from skimage.measure import label
10+
import numpy as np
11+
12+
labels = label(segmentation)
13+
assert labels.max() != 0 # assume at least 1 CC
14+
largestCC = labels == np.argmax(np.bincount(labels.flat)[1:])+1
15+
return largestCC, labels
16+
17+
718
def keep_gcc(nii_file):
819
import os
920
import nibabel as nib
1021
import numpy as np
1122
from nipype.utils.filemanip import split_filename as split_f
1223

13-
def getLargestCC(segmentation):
14-
15-
from skimage.measure import label
16-
17-
labels = label(segmentation)
18-
assert labels.max() != 0 # assume at least 1 CC
19-
largestCC = labels == np.argmax(np.bincount(labels.flat)[1:])+1
20-
return largestCC, labels
24+
from macapype.nodes.surface import getLargestCC
2125

2226
# nibabel (nifti -> np.array)
2327
img = nib.load(nii_file)
@@ -50,6 +54,44 @@ def getLargestCC(segmentation):
5054
return gcc_nii_file
5155

5256

57+
def keep_gcc_by_index(nii_file):
58+
import os
59+
import nibabel as nib
60+
import numpy as np
61+
from nipype.utils.filemanip import split_filename as split_f
62+
63+
from macapype.nodes.surface import getLargestCC
64+
65+
# nibabel (nifti -> np.array)
66+
img = nib.load(nii_file)
67+
data = img.get_fdata().astype(np.int16)
68+
69+
path, fname, ext = split_f(nii_file)
70+
71+
print(np.unique(data))
72+
73+
new_data = np.zeros(data.shape, data.dtype)
74+
75+
for index in np.unique(data)[1:]:
76+
data_data_bin_index = np.zeros(data.shape, data.dtype)
77+
data_data_bin_index[data == index] = 1
78+
79+
if np.sum(data_data_bin_index):
80+
gcc_index_data, _ = getLargestCC(data_data_bin_index)
81+
new_data[gcc_index_data] = index
82+
83+
# nibabel (np.array -> nifti)
84+
new_img = nib.Nifti1Image(dataobj=new_data,
85+
header=img.header,
86+
affine=img.affine)
87+
88+
gcc_nii_file = os.path.abspath(fname + "_gcc" + ext)
89+
90+
nib.save(new_img, gcc_nii_file)
91+
92+
return gcc_nii_file
93+
94+
5395
def merge_tissues(dseg_file, keep_indexes):
5496

5597
import os

macapype/pipelines/surface.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111
from macapype.nodes.surface import (Meshify, split_LR_mask,
1212
wrap_nii2mesh,
1313
IsoSurface, merge_tissues,
14-
keep_gcc)
14+
keep_gcc,
15+
keep_gcc_by_index)
1516

1617
from macapype.utils.utils_nodes import parse_key, NodeParams
1718

@@ -704,6 +705,16 @@ def create_IsoSurface_brain_pipe(params={},
704705
fields=["segmented_file"]),
705706
name='inputnode')
706707

708+
# keep_gcc_mask
709+
keep_gcc_mask = pe.Node(
710+
interface=niu.Function(input_names=["nii_file"],
711+
output_names=["gcc_nii_file"],
712+
function=keep_gcc_by_index),
713+
name="keep_gcc_mask")
714+
715+
IsoSurface_brain_pipe.connect(inputnode, 'segmented_file',
716+
keep_gcc_mask, "nii_file")
717+
707718
# merge_brain_tissues
708719
merge_brain_tissues = NodeParams(
709720
interface=niu.Function(input_names=["dseg_file", "keep_indexes"],
@@ -712,7 +723,7 @@ def create_IsoSurface_brain_pipe(params={},
712723
params=parse_key(params, "merge_brain_tissues"),
713724
name="merge_brain_tissues")
714725

715-
IsoSurface_brain_pipe.connect(inputnode, 'segmented_file',
726+
IsoSurface_brain_pipe.connect(keep_gcc_mask, "gcc_nii_file",
716727
merge_brain_tissues, 'dseg_file')
717728

718729
# keep_gcc_bin_mask

0 commit comments

Comments
 (0)