Commit 09915b7f1fe2b89823044c02c32911165671163d
1 parent
a8e514b4
Exists in
vtk6
Watershed using vtk6
Showing
2 changed files
with
54 additions
and
47 deletions
Show diff stats
invesalius/data/styles.py
... | ... | @@ -59,10 +59,14 @@ WATERSHED_OPERATIONS = {_("Erase"): BRUSH_ERASE, |
59 | 59 | _("Background"): BRUSH_BACKGROUND,} |
60 | 60 | |
61 | 61 | def get_LUT_value(data, window, level): |
62 | - return np.piecewise(data, | |
63 | - [data <= (level - 0.5 - (window-1)/2), | |
64 | - data > (level - 0.5 + (window-1)/2)], | |
65 | - [0, window, lambda data: ((data - (level - 0.5))/(window-1) + 0.5)*(window)]) | |
62 | + shape = data.shape | |
63 | + data_ = data.ravel() | |
64 | + data = np.piecewise(data_, | |
65 | + [data_ <= (level - 0.5 - (window-1)/2), | |
66 | + data_ > (level - 0.5 + (window-1)/2)], | |
67 | + [0, window, lambda data_: ((data_ - (level - 0.5))/(window-1) + 0.5)*(window)]) | |
68 | + data.shape = shape | |
69 | + return data | |
66 | 70 | |
67 | 71 | class BaseImageInteractorStyle(vtk.vtkInteractorStyleImage): |
68 | 72 | def __init__(self, viewer): | ... | ... |
invesalius/data/watershed_process.py
1 | -import numpy as np | |
2 | -from scipy import ndimage | |
3 | -from scipy.ndimage import watershed_ift, generate_binary_structure | |
4 | -from skimage.morphology import watershed | |
5 | -from skimage import filter | |
6 | - | |
7 | - | |
8 | -def get_LUT_value(data, window, level): | |
9 | - return np.piecewise(data, | |
10 | - [data <= (level - 0.5 - (window-1)/2), | |
11 | - data > (level - 0.5 + (window-1)/2)], | |
12 | - [0, 255, lambda data: ((data - (level - 0.5))/(window-1) + 0.5)*(255-0)]) | |
13 | - | |
14 | - | |
15 | - | |
16 | -def do_watershed(image, markers, tfile, shape, bstruct, algorithm, mg_size, use_ww_wl, wl, ww, q): | |
17 | - mask = np.memmap(tfile, shape=shape, dtype='uint8', mode='r+') | |
18 | - | |
19 | - if use_ww_wl: | |
20 | - if algorithm == 'Watershed': | |
21 | - tmp_image = ndimage.morphological_gradient( | |
22 | - get_LUT_value(image, ww, wl).astype('uint16'), | |
23 | - mg_size) | |
24 | - tmp_mask = watershed(tmp_image, markers.astype('int16'), bstruct) | |
25 | - else: | |
26 | - tmp_image = get_LUT_value(image, ww, wl).astype('uint16') | |
27 | - #tmp_image = ndimage.gaussian_filter(tmp_image, self.config.mg_size) | |
28 | - #tmp_image = ndimage.morphological_gradient( | |
29 | - #get_LUT_value(image, ww, wl).astype('uint16'), | |
30 | - #self.config.mg_size) | |
31 | - tmp_mask = watershed_ift(tmp_image, markers.astype('int16'), bstruct) | |
32 | - else: | |
33 | - if algorithm == 'Watershed': | |
34 | - tmp_image = ndimage.morphological_gradient((image - image.min()).astype('uint16'), mg_size) | |
35 | - tmp_mask = watershed(tmp_image, markers.astype('int16'), bstruct) | |
36 | - else: | |
37 | - tmp_image = (image - image.min()).astype('uint16') | |
38 | - #tmp_image = ndimage.gaussian_filter(tmp_image, self.config.mg_size) | |
39 | - #tmp_image = ndimage.morphological_gradient((image - image.min()).astype('uint16'), self.config.mg_size) | |
40 | - tmp_mask = watershed_ift(tmp_image, markers.astype('int8'), bstruct) | |
41 | - mask[:] = tmp_mask | |
42 | - mask.flush() | |
43 | - q.put(1) | |
1 | +import numpy as np | |
2 | +from scipy import ndimage | |
3 | +from scipy.ndimage import watershed_ift, generate_binary_structure | |
4 | +from skimage.morphology import watershed | |
5 | +from skimage import filter | |
6 | + | |
7 | + | |
8 | +def get_LUT_value(data, window, level): | |
9 | + shape = data.shape | |
10 | + data_ = data.ravel() | |
11 | + data = np.piecewise(data_, | |
12 | + [data_ <= (level - 0.5 - (window-1)/2), | |
13 | + data_ > (level - 0.5 + (window-1)/2)], | |
14 | + [0, window, lambda data_: ((data_ - (level - 0.5))/(window-1) + 0.5)*(window)]) | |
15 | + data.shape = shape | |
16 | + return data | |
17 | + | |
18 | + | |
19 | +def do_watershed(image, markers, tfile, shape, bstruct, algorithm, mg_size, use_ww_wl, wl, ww, q): | |
20 | + mask = np.memmap(tfile, shape=shape, dtype='uint8', mode='r+') | |
21 | + | |
22 | + if use_ww_wl: | |
23 | + if algorithm == 'Watershed': | |
24 | + tmp_image = ndimage.morphological_gradient( | |
25 | + get_LUT_value(image, ww, wl).astype('uint16'), | |
26 | + mg_size) | |
27 | + tmp_mask = watershed(tmp_image, markers.astype('int16'), bstruct) | |
28 | + else: | |
29 | + tmp_image = get_LUT_value(image, ww, wl).astype('uint16') | |
30 | + #tmp_image = ndimage.gaussian_filter(tmp_image, self.config.mg_size) | |
31 | + #tmp_image = ndimage.morphological_gradient( | |
32 | + #get_LUT_value(image, ww, wl).astype('uint16'), | |
33 | + #self.config.mg_size) | |
34 | + tmp_mask = watershed_ift(tmp_image, markers.astype('int16'), bstruct) | |
35 | + else: | |
36 | + if algorithm == 'Watershed': | |
37 | + tmp_image = ndimage.morphological_gradient((image - image.min()).astype('uint16'), mg_size) | |
38 | + tmp_mask = watershed(tmp_image, markers.astype('int16'), bstruct) | |
39 | + else: | |
40 | + tmp_image = (image - image.min()).astype('uint16') | |
41 | + #tmp_image = ndimage.gaussian_filter(tmp_image, self.config.mg_size) | |
42 | + #tmp_image = ndimage.morphological_gradient((image - image.min()).astype('uint16'), self.config.mg_size) | |
43 | + tmp_mask = watershed_ift(tmp_image, markers.astype('int8'), bstruct) | |
44 | + mask[:] = tmp_mask | |
45 | + mask.flush() | |
46 | + q.put(1) | ... | ... |