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,10 +59,14 @@ WATERSHED_OPERATIONS = {_("Erase"): BRUSH_ERASE, | ||
59 | _("Background"): BRUSH_BACKGROUND,} | 59 | _("Background"): BRUSH_BACKGROUND,} |
60 | 60 | ||
61 | def get_LUT_value(data, window, level): | 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 | class BaseImageInteractorStyle(vtk.vtkInteractorStyleImage): | 71 | class BaseImageInteractorStyle(vtk.vtkInteractorStyleImage): |
68 | def __init__(self, viewer): | 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) |