@@ -123,40 +123,61 @@ def merge_and_mean(name='mm'):
123
123
return wf
124
124
125
125
126
- def gen_chunks (dwi , mask , nchunks = 6 ):
126
+ def gen_chunks (dwi , mask , nvoxels = 100 ):
127
127
import nibabel as nb
128
128
import numpy as np
129
+ from math import sqrt , ceil
129
130
130
131
mask = nb .load (mask ).get_data ()
131
132
mask [mask > 0 ] = 1
132
133
mask [mask < 1 ] = 0
133
- nzels = np .nonzero (mask )
134
- np .savetxt ('nonzeroidx.txt' , nzels )
135
134
136
135
dshape = mask .shape
137
136
mask = mask .reshape (- 1 ).astype (np .uint8 )
137
+
138
+ nzels = np .nonzero (mask )
139
+ np .savez ('nonzeroidx' , nzels )
138
140
els = np .sum (mask )
139
- chunkels = round (els / nchunks )
140
141
141
- data = mask .copy ()
142
+ chunkside = int (ceil (sqrt (nvoxels )))
143
+ chshape = (chunkside , chunkside , 1 )
144
+ chunkels = chunkside ** 2
145
+ nchunks = int (ceil (els / chunkels ))
146
+
147
+ data = nb .load (dwi ).get_data ().astype (np .float32 )
148
+ data = np .squeeze (data .reshape ((mask .size , - 1 )).take (nzels , axis = 0 ))
142
149
143
150
out_files = []
144
151
out_masks = []
145
152
146
- for i in xrange (chunkels ):
153
+ for i in xrange (nchunks ):
147
154
first = i * chunkels
148
- last = (i + 1 ) * chunkels + 1
155
+ last = (i + 1 ) * chunkels
156
+ fill = 0
149
157
150
- chunk = data [first :last , ...]
158
+ if last > els :
159
+ fill = last - els
160
+ last = els
151
161
152
- fname = 'chunk%05d.nii.gz' % i
153
- nb .Nifti1Image (chunk , None , None ).to_filename (fname )
154
- out_files .append (fname )
162
+ datchunk = data [first :last , ...]
163
+ mskchunk = np .ones ((last - first ), dtype = np .uint8 )
164
+
165
+ if fill > 0 :
166
+ print 'filling %d elements' % fill
167
+ mskchunk = np .hstack ((mskchunk , np .zeros ((fill ,), dtype = np .uint8 )))
168
+ datchunk = np .vstack ((datchunk , np .zeros ((fill ,
169
+ data .shape [- 1 ]), dtype = np .float32 )))
155
170
156
171
mname = 'mask%05d.nii.gz' % i
157
- nb .Nifti1Image (mask [ first : last ] ,
172
+ nb .Nifti1Image (mskchunk . reshape ( chshape ) ,
158
173
None , None ).to_filename (mname )
159
174
out_masks .append (mname )
160
175
176
+ datashape = [s for s in chshape ] + [- 1 ]
177
+ fname = 'chunk%05d.nii.gz' % i
178
+ nb .Nifti1Image (datchunk .reshape (tuple (datashape )),
179
+ None , None ).to_filename (fname )
180
+ out_files .append (fname )
181
+
161
182
return out_files , out_masks
162
183
0 commit comments