3
3
# vi: set ft=python sts=4 ts=4 sw=4 et:
4
4
""" Script example of tissue classification
5
5
"""
6
-
7
6
import numpy as np
8
7
9
- from nipy .externals .argparse import ArgumentParser
10
8
from nipy import load_image , save_image
11
- from nipy .algorithms .segmentation import brain_segmentation
12
-
13
- NITERS = 10
14
- BETA = 0.2
15
- SCHEME = 'mf'
16
- NOISE = 'gauss'
17
- FREEZE_PROP = True
18
- LABELS = ('CSF' , 'GM' , 'WM' )
19
- K_CSF = 1
20
- K_GM = 1
21
- K_WM = 1
9
+ from nipy .core .image .image_spaces import (make_xyz_image ,
10
+ xyz_affine )
11
+ from nipy .externals .argparse import ArgumentParser
12
+ from nipy .algorithms .segmentation import BrainT1Segmentation
22
13
23
14
24
- def fuzzy_dice (gpm , ppm , mask ):
15
+ def fuzzy_dice (gold_ppm , ppm , mask ):
25
16
"""
26
17
Fuzzy dice index.
27
18
"""
28
19
dices = np .zeros (3 )
29
- if gpm == None :
20
+ if gold_ppm == None :
30
21
return dices
31
22
for k in range (3 ):
32
- pk = gpm [ k ]. get_data ()[ mask ]
33
- qk = ppm . get_data () [mask ][:, k ]
23
+ pk = gold_ppm [ mask ][:, k ]
24
+ qk = ppm [mask ][:, k ]
34
25
PQ = np .sum (np .sqrt (np .maximum (pk * qk , 0 )))
35
26
P = np .sum (pk )
36
27
Q = np .sum (qk )
@@ -46,22 +37,12 @@ def fuzzy_dice(gpm, ppm, mask):
46
37
parser = ArgumentParser (description = description )
47
38
parser .add_argument ('img' , metavar = 'img' , nargs = '+' , help = 'input image' )
48
39
parser .add_argument ('--mask' , dest = 'mask' , help = 'mask image' )
49
- parser .add_argument ('--k_csf' , dest = 'k_csf' ,
50
- help = 'number of CSF classes (default=%d)' % K_CSF )
51
- parser .add_argument ('--k_gm' , dest = 'k_gm' ,
52
- help = 'number of GM classes (default=%d)' % K_GM )
53
- parser .add_argument ('--k_wm' , dest = 'k_wm' ,
54
- help = 'number of WM classes (default=%d)' % K_WM )
55
40
parser .add_argument ('--niters' , dest = 'niters' ,
56
- help = 'number of iterations (default=%d)' % NITERS )
41
+ help = 'number of iterations (default=%d)' % 25 )
57
42
parser .add_argument ('--beta' , dest = 'beta' ,
58
- help = 'Markov random field beta parameter (default=%f)' % BETA )
59
- parser .add_argument ('--scheme' , dest = 'scheme' ,
60
- help = 'message passing scheme (mf, icm or bp, default=%s)' % SCHEME )
61
- parser .add_argument ('--noise' , dest = 'noise' ,
62
- help = 'noise model (gauss or laplace, default=%s)' % NOISE )
63
- parser .add_argument ('--freeze_prop' , dest = 'freeze_prop' ,
64
- help = 'freeze tissue proportions (default=1)' )
43
+ help = 'Markov random field beta parameter (default=%f)' % 0.5 )
44
+ parser .add_argument ('--ngb_size' , dest = 'ngb_size' ,
45
+ help = 'Markov random field neighborhood system (default=%d)' % 6 )
65
46
parser .add_argument ('--probc' , dest = 'probc' , help = 'csf probability map' )
66
47
parser .add_argument ('--probg' , dest = 'probg' ,
67
48
help = 'gray matter probability map' )
@@ -81,52 +62,37 @@ def get_argument(dest, default):
81
62
img = load_image (args .img [0 ])
82
63
83
64
# Input mask image
84
- mask = get_argument ('mask' , None )
85
- if mask == None :
65
+ mask_img = get_argument ('mask' , None )
66
+ if mask_img == None :
86
67
mask_img = img
87
68
else :
88
- mask_img = load_image (mask )
69
+ mask_img = load_image (mask_img )
89
70
90
71
# Other optional arguments
91
- k_csf = int (get_argument ('k_csf' , K_CSF ))
92
- k_gm = int (get_argument ('k_gm' , K_GM ))
93
- k_wm = int (get_argument ('k_wm' , K_WM ))
94
- niters = int (get_argument ('niters' , NITERS ))
95
- beta = float (get_argument ('beta' , BETA ))
96
- scheme = get_argument ('scheme' , SCHEME )
97
- noise = get_argument ('noise' , NOISE )
98
- freeze_prop = get_argument ('freeze_prop' , FREEZE_PROP )
99
-
100
-
101
- # Labels
102
- labels = []
103
- labels += ['CSF' for k in range (k_csf )]
104
- labels += ['GM' for k in range (k_gm )]
105
- labels += ['WM' for k in range (k_wm )]
106
- mixmat = []
107
- mixmat += [[1 , 0 , 0 ] for k in range (k_csf )]
108
- mixmat += [[0 , 1 , 0 ] for k in range (k_gm )]
109
- mixmat += [[0 , 0 , 1 ] for k in range (k_wm )]
110
- mixmat = np .array (mixmat )
72
+ niters = int (get_argument ('niters' , 25 ))
73
+ beta = float (get_argument ('beta' , 0.5 ))
74
+ ngb_size = int (get_argument ('ngb_size' , 6 ))
111
75
112
76
# Perform tissue classification
113
- ppm_img , label_img = brain_segmentation (img ,
114
- mask_img = mask_img ,
115
- beta = beta , niters = niters ,
116
- labels = labels , mixmat = mixmat ,
117
- noise = noise , freeze_prop = freeze_prop ,
118
- scheme = SCHEME )
77
+ mask = mask_img .get_data () > 0
78
+ S = BrainT1Segmentation (img .get_data (), mask = mask , model = '5k' ,
79
+ niters = niters , beta = beta , ngb_size = ngb_size )
80
+
81
+ # Save label image
119
82
outfile = 'hard_classif.nii'
120
- save_image (label_img , outfile )
83
+ save_image (make_xyz_image (S .label , xyz_affine (img ), 'scanner' ),
84
+ outfile )
121
85
print ('Label image saved in: %s' % outfile )
122
86
123
87
# Compute fuzzy Dice indices if a 3-class fuzzy model is provided
124
88
if not args .probc == None and \
125
89
not args .probg == None and \
126
90
not args .probw == None :
127
91
print ('Computing Dice index' )
128
- gpm = [load_image (args .probc ),
129
- load_image (args .probg ),
130
- load_image (args .probw )]
131
- d = fuzzy_dice (gpm , ppm_img , np .where (mask_img .get_data () > 0 ))
92
+ gold_ppm = np .zeros (S .ppm .shape )
93
+ gold_ppm_img = (args .probc , args .probg , args .probw )
94
+ for k in range (3 ):
95
+ img = load_image (gold_ppm_img [k ])
96
+ gold_ppm [..., k ] = img .get_data ()
97
+ d = fuzzy_dice (gold_ppm , S .ppm , np .where (mask_img .get_data () > 0 ))
132
98
print ('Fuzzy Dice indices: %s' % d )
0 commit comments