Commit f6fab930746412c08db88c49f27914f1af42cdf2
1 parent
c0352ef3
Exists in
region_growing_confidence
created a separated function
Showing
2 changed files
with
73 additions
and
73 deletions
Show diff stats
invesalius/data/styles.py
@@ -2052,88 +2052,43 @@ class FloodFillSegmentInteractorStyle(DefaultInteractorStyle): | @@ -2052,88 +2052,43 @@ class FloodFillSegmentInteractorStyle(DefaultInteractorStyle): | ||
2052 | mask = self.viewer.slice_.buffer_slices[self.orientation].mask.copy() | 2052 | mask = self.viewer.slice_.buffer_slices[self.orientation].mask.copy() |
2053 | image = self.viewer.slice_.buffer_slices[self.orientation].image | 2053 | image = self.viewer.slice_.buffer_slices[self.orientation].image |
2054 | 2054 | ||
2055 | - if self.config.method == 'threshold': | ||
2056 | - v = image[y, x] | ||
2057 | - t0 = self.config.t0 | ||
2058 | - t1 = self.config.t1 | ||
2059 | - | ||
2060 | - elif self.config.method == 'dynamic1': | ||
2061 | - if self.config.use_ww_wl: | ||
2062 | - print "Using WW&WL" | ||
2063 | - ww = self.viewer.slice_.window_width | ||
2064 | - wl = self.viewer.slice_.window_level | ||
2065 | - image = get_LUT_value_255(image, ww, wl) | ||
2066 | - | ||
2067 | - v = image[y, x] | ||
2068 | - | ||
2069 | - t0 = v - self.config.dev_min | ||
2070 | - t1 = v + self.config.dev_max | ||
2071 | - | ||
2072 | - else: | 2055 | + if self.config.method == 'confidence': |
2073 | dy, dx = image.shape | 2056 | dy, dx = image.shape |
2074 | image = image.reshape((1, dy, dx)) | 2057 | image = image.reshape((1, dy, dx)) |
2075 | mask = mask.reshape((1, dy, dx)) | 2058 | mask = mask.reshape((1, dy, dx)) |
2076 | - if self.config.use_ww_wl: | ||
2077 | - print "Using WW&WL" | ||
2078 | - ww = self.viewer.slice_.window_width | ||
2079 | - wl = self.viewer.slice_.window_level | ||
2080 | - image = get_LUT_value_255(image, ww, wl) | ||
2081 | - bool_mask = np.zeros_like(mask, dtype='bool') | ||
2082 | - out_mask = np.zeros_like(mask) | ||
2083 | - for i in xrange(int(x-1), int(x+2)): | ||
2084 | - if i < 0 or i >= bool_mask.shape[2]: | ||
2085 | - continue | ||
2086 | - for j in xrange(int(y-1), int(y+2)): | ||
2087 | - if j < 0 or j >= bool_mask.shape[1]: | ||
2088 | - continue | ||
2089 | - bool_mask[0, j, i] = True | ||
2090 | - | ||
2091 | - | ||
2092 | - bstruct = np.array(generate_binary_structure(2, CON2D[self.config.con_2d]), dtype='uint8') | ||
2093 | - bstruct = bstruct.reshape((1, 3, 3)) | ||
2094 | - | ||
2095 | - for i in xrange(3): | ||
2096 | - var = np.std(image[bool_mask]) | ||
2097 | - mean = np.mean(image[bool_mask]) | ||
2098 | - | ||
2099 | - t0 = mean - var * 2.5 | ||
2100 | - t1 = mean + var * 2.5 | ||
2101 | - print var, mean, t0, t1 | ||
2102 | - | ||
2103 | - floodfill.floodfill_threshold(image, [[x, y, 0]], t0, t1, 1, bstruct, out_mask) | ||
2104 | - | ||
2105 | - bool_mask[out_mask == 1] = True | ||
2106 | - | ||
2107 | - mask[out_mask.astype('bool')] = self.config.fill_value | 2059 | + out_mask = self.do_rg_confidence((x, y, 0), image, mask) |
2060 | + else: | ||
2061 | + if self.config.method == 'threshold': | ||
2062 | + v = image[y, x] | ||
2063 | + t0 = self.config.t0 | ||
2064 | + t1 = self.config.t1 | ||
2108 | 2065 | ||
2109 | - index = self.viewer.slice_.buffer_slices[self.orientation].index | ||
2110 | - b_mask = self.viewer.slice_.buffer_slices[self.orientation].mask | ||
2111 | - vol_mask = self.viewer.slice_.current_mask.matrix[1:, 1:, 1:] | 2066 | + elif self.config.method == 'dynamic': |
2067 | + if self.config.use_ww_wl: | ||
2068 | + print "Using WW&WL" | ||
2069 | + ww = self.viewer.slice_.window_width | ||
2070 | + wl = self.viewer.slice_.window_level | ||
2071 | + image = get_LUT_value_255(image, ww, wl) | ||
2112 | 2072 | ||
2113 | - if self.orientation == 'AXIAL': | ||
2114 | - vol_mask[index, :, :] = mask | ||
2115 | - elif self.orientation == 'CORONAL': | ||
2116 | - vol_mask[:, index, :] = mask | ||
2117 | - elif self.orientation == 'SAGITAL': | ||
2118 | - vol_mask[:, :, index] = mask | 2073 | + v = image[y, x] |
2119 | 2074 | ||
2120 | - self.viewer.slice_.current_mask.save_history(index, self.orientation, mask, b_mask) | 2075 | + t0 = v - self.config.dev_min |
2076 | + t1 = v + self.config.dev_max | ||
2121 | 2077 | ||
2122 | - return | ||
2123 | 2078 | ||
2124 | - if image[y, x] < t0 or image[y, x] > t1: | ||
2125 | - return | 2079 | + if image[y, x] < t0 or image[y, x] > t1: |
2080 | + return | ||
2126 | 2081 | ||
2127 | - dy, dx = image.shape | ||
2128 | - image = image.reshape((1, dy, dx)) | ||
2129 | - mask = mask.reshape((1, dy, dx)) | 2082 | + dy, dx = image.shape |
2083 | + image = image.reshape((1, dy, dx)) | ||
2084 | + mask = mask.reshape((1, dy, dx)) | ||
2130 | 2085 | ||
2131 | - out_mask = np.zeros_like(mask) | 2086 | + out_mask = np.zeros_like(mask) |
2132 | 2087 | ||
2133 | - bstruct = np.array(generate_binary_structure(2, CON2D[self.config.con_2d]), dtype='uint8') | ||
2134 | - bstruct = bstruct.reshape((1, 3, 3)) | 2088 | + bstruct = np.array(generate_binary_structure(2, CON2D[self.config.con_2d]), dtype='uint8') |
2089 | + bstruct = bstruct.reshape((1, 3, 3)) | ||
2135 | 2090 | ||
2136 | - floodfill.floodfill_threshold(image, [[x, y, 0]], t0, t1, 1, bstruct, out_mask) | 2091 | + floodfill.floodfill_threshold(image, [[x, y, 0]], t0, t1, 1, bstruct, out_mask) |
2137 | 2092 | ||
2138 | mask[out_mask.astype('bool')] = self.config.fill_value | 2093 | mask[out_mask.astype('bool')] = self.config.fill_value |
2139 | 2094 | ||
@@ -2199,6 +2154,41 @@ class FloodFillSegmentInteractorStyle(DefaultInteractorStyle): | @@ -2199,6 +2154,41 @@ class FloodFillSegmentInteractorStyle(DefaultInteractorStyle): | ||
2199 | 2154 | ||
2200 | self.viewer.slice_.current_mask.save_history(0, 'VOLUME', self.viewer.slice_.current_mask.matrix.copy(), cp_mask) | 2155 | self.viewer.slice_.current_mask.save_history(0, 'VOLUME', self.viewer.slice_.current_mask.matrix.copy(), cp_mask) |
2201 | 2156 | ||
2157 | + def do_rg_confidence(self, p, image, mask): | ||
2158 | + x, y, z = p | ||
2159 | + if self.config.use_ww_wl: | ||
2160 | + print "Using WW&WL" | ||
2161 | + ww = self.viewer.slice_.window_width | ||
2162 | + wl = self.viewer.slice_.window_level | ||
2163 | + image = get_LUT_value_255(image, ww, wl) | ||
2164 | + bool_mask = np.zeros_like(mask, dtype='bool') | ||
2165 | + out_mask = np.zeros_like(mask) | ||
2166 | + for i in xrange(int(x-1), int(x+2)): | ||
2167 | + if i < 0 or i >= bool_mask.shape[2]: | ||
2168 | + continue | ||
2169 | + for j in xrange(int(y-1), int(y+2)): | ||
2170 | + if j < 0 or j >= bool_mask.shape[1]: | ||
2171 | + continue | ||
2172 | + bool_mask[0, j, i] = True | ||
2173 | + | ||
2174 | + | ||
2175 | + bstruct = np.array(generate_binary_structure(2, CON2D[self.config.con_2d]), dtype='uint8') | ||
2176 | + bstruct = bstruct.reshape((1, 3, 3)) | ||
2177 | + | ||
2178 | + for i in xrange(3): | ||
2179 | + var = np.std(image[bool_mask]) | ||
2180 | + mean = np.mean(image[bool_mask]) | ||
2181 | + | ||
2182 | + t0 = mean - var * 2.5 | ||
2183 | + t1 = mean + var * 2.5 | ||
2184 | + print var, mean, t0, t1 | ||
2185 | + | ||
2186 | + floodfill.floodfill_threshold(image, [[x, y, 0]], t0, t1, 1, bstruct, out_mask) | ||
2187 | + | ||
2188 | + bool_mask[out_mask == 1] = True | ||
2189 | + | ||
2190 | + return out_mask | ||
2191 | + | ||
2202 | def get_style(style): | 2192 | def get_style(style): |
2203 | STYLES = { | 2193 | STYLES = { |
2204 | const.STATE_DEFAULT: DefaultInteractorStyle, | 2194 | const.STATE_DEFAULT: DefaultInteractorStyle, |
invesalius/gui/dialogs.py
@@ -2273,13 +2273,14 @@ class FFillSegmentationOptionsDialog(wx.Dialog): | @@ -2273,13 +2273,14 @@ class FFillSegmentationOptionsDialog(wx.Dialog): | ||
2273 | else: | 2273 | else: |
2274 | self.panel3dcon.conect3D_6.SetValue(1) | 2274 | self.panel3dcon.conect3D_6.SetValue(1) |
2275 | 2275 | ||
2276 | - self.cmb_method = wx.ComboBox(self, -1, choices=(_(u"Dynamic"), _(u"Threshold")), style=wx.CB_READONLY) | 2276 | + self.cmb_method = wx.ComboBox(self, -1, choices=(_(u"Dynamic"), _(u"Threshold"), _(u"Confidence")), style=wx.CB_READONLY) |
2277 | 2277 | ||
2278 | if self.config.method == 'dynamic': | 2278 | if self.config.method == 'dynamic': |
2279 | self.cmb_method.SetSelection(0) | 2279 | self.cmb_method.SetSelection(0) |
2280 | - else: | 2280 | + elif self.config.method == 'threshold': |
2281 | self.cmb_method.SetSelection(1) | 2281 | self.cmb_method.SetSelection(1) |
2282 | - self.config.method = 'threshold' | 2282 | + elif self.config.method == 'confidence': |
2283 | + self.cmb_method.SetSelection(2) | ||
2283 | 2284 | ||
2284 | self.panel_ffill_threshold = PanelFFillThreshold(self, self.config, -1, style=border_style|wx.TAB_TRAVERSAL) | 2285 | self.panel_ffill_threshold = PanelFFillThreshold(self, self.config, -1, style=border_style|wx.TAB_TRAVERSAL) |
2285 | self.panel_ffill_threshold.SetMinSize((250, -1)) | 2286 | self.panel_ffill_threshold.SetMinSize((250, -1)) |
@@ -2313,6 +2314,10 @@ class FFillSegmentationOptionsDialog(wx.Dialog): | @@ -2313,6 +2314,10 @@ class FFillSegmentationOptionsDialog(wx.Dialog): | ||
2313 | self.cmb_method.SetSelection(0) | 2314 | self.cmb_method.SetSelection(0) |
2314 | self.panel_ffill_dynamic.Show() | 2315 | self.panel_ffill_dynamic.Show() |
2315 | sizer.Add(self.panel_ffill_dynamic, (11, 0), (1, 6), flag=wx.LEFT|wx.RIGHT|wx.EXPAND, border=7) | 2316 | sizer.Add(self.panel_ffill_dynamic, (11, 0), (1, 6), flag=wx.LEFT|wx.RIGHT|wx.EXPAND, border=7) |
2317 | + elif self.config.method == 'confidence': | ||
2318 | + self.cmb_method.SetSelection(2) | ||
2319 | + self.panel_ffill_dynamic.Show() | ||
2320 | + sizer.Add(self.panel_ffill_dynamic, (11, 0), (1, 6), flag=wx.LEFT|wx.RIGHT|wx.EXPAND, border=7) | ||
2316 | else: | 2321 | else: |
2317 | self.cmb_method.SetSelection(1) | 2322 | self.cmb_method.SetSelection(1) |
2318 | self.panel_ffill_threshold.Show() | 2323 | self.panel_ffill_threshold.Show() |
@@ -2363,6 +2368,11 @@ class FFillSegmentationOptionsDialog(wx.Dialog): | @@ -2363,6 +2368,11 @@ class FFillSegmentationOptionsDialog(wx.Dialog): | ||
2363 | self.panel_ffill_threshold.Hide() | 2368 | self.panel_ffill_threshold.Hide() |
2364 | self.panel_ffill_dynamic.Show() | 2369 | self.panel_ffill_dynamic.Show() |
2365 | self.GetSizer().Replace(self.panel_ffill_threshold, self.panel_ffill_dynamic) | 2370 | self.GetSizer().Replace(self.panel_ffill_threshold, self.panel_ffill_dynamic) |
2371 | + elif self.cmb_method.GetSelection() == 2: | ||
2372 | + self.config.method = 'confidence' | ||
2373 | + self.panel_ffill_threshold.Hide() | ||
2374 | + self.panel_ffill_dynamic.Show() | ||
2375 | + self.GetSizer().Replace(self.panel_ffill_threshold, self.panel_ffill_dynamic) | ||
2366 | else: | 2376 | else: |
2367 | self.config.method = 'threshold' | 2377 | self.config.method = 'threshold' |
2368 | self.panel_ffill_dynamic.Hide() | 2378 | self.panel_ffill_dynamic.Hide() |