Commit 1237f50167fc5039c36ba2f54804835c68f1771c
1 parent
ca4ae9a3
Exists in
region_growing_confidence
Added a gui to confidence
Showing
2 changed files
with
98 additions
and
20 deletions
Show diff stats
invesalius/data/styles.py
... | ... | @@ -1983,6 +1983,9 @@ class FFillSegmentationConfig(object): |
1983 | 1983 | |
1984 | 1984 | self.use_ww_wl = True |
1985 | 1985 | |
1986 | + self.confid_mult = 2.5 | |
1987 | + self.confid_iters = 3 | |
1988 | + | |
1986 | 1989 | |
1987 | 1990 | class FloodFillSegmentInteractorStyle(DefaultInteractorStyle): |
1988 | 1991 | def __init__(self, viewer): |
... | ... | @@ -2145,7 +2148,15 @@ class FloodFillSegmentInteractorStyle(DefaultInteractorStyle): |
2145 | 2148 | cp_mask = self.viewer.slice_.current_mask.matrix.copy() |
2146 | 2149 | |
2147 | 2150 | if self.config.method == 'confidence': |
2148 | - out_mask = self.do_rg_confidence(image, mask, (x, y, z), bstruct) | |
2151 | + with futures.ThreadPoolExecutor(max_workers=1) as executor: | |
2152 | + future = executor.submit(self.do_rg_confidence, image, mask, (x, y, z), bstruct) | |
2153 | + | |
2154 | + dlg = wx.ProgressDialog(self._progr_title, self._progr_msg, parent=None, style=wx.PD_APP_MODAL) | |
2155 | + while not future.done(): | |
2156 | + dlg.Pulse() | |
2157 | + time.sleep(0.1) | |
2158 | + dlg.Destroy() | |
2159 | + out_mask = future.result() | |
2149 | 2160 | else: |
2150 | 2161 | out_mask = np.zeros_like(mask) |
2151 | 2162 | with futures.ThreadPoolExecutor(max_workers=1) as executor: |
... | ... | @@ -2171,27 +2182,28 @@ class FloodFillSegmentInteractorStyle(DefaultInteractorStyle): |
2171 | 2182 | image = get_LUT_value_255(image, ww, wl) |
2172 | 2183 | bool_mask = np.zeros_like(mask, dtype='bool') |
2173 | 2184 | out_mask = np.zeros_like(mask) |
2174 | - for i in xrange(int(x-1), int(x+2)): | |
2175 | - if i < 0 or i >= bool_mask.shape[2]: | |
2185 | + | |
2186 | + for k in xrange(int(z-1), int(z+2)): | |
2187 | + if k < 0 or k >= bool_mask.shape[0]: | |
2176 | 2188 | continue |
2177 | 2189 | for j in xrange(int(y-1), int(y+2)): |
2178 | 2190 | if j < 0 or j >= bool_mask.shape[1]: |
2179 | 2191 | continue |
2180 | - for k in xrange(int(z-1), int(z+2)): | |
2181 | - if k < 0 or k >= bool_mask.shape[0]: | |
2192 | + for i in xrange(int(x-1), int(x+2)): | |
2193 | + if i < 0 or i >= bool_mask.shape[2]: | |
2182 | 2194 | continue |
2183 | 2195 | bool_mask[k, j, i] = True |
2184 | 2196 | |
2185 | - | |
2186 | - for i in xrange(3): | |
2197 | + for i in xrange(self.config.confid_iters): | |
2187 | 2198 | var = np.std(image[bool_mask]) |
2188 | 2199 | mean = np.mean(image[bool_mask]) |
2189 | 2200 | |
2190 | - t0 = mean - var * 2.5 | |
2191 | - t1 = mean + var * 2.5 | |
2192 | - print var, mean, t0, t1 | |
2201 | + t0 = mean - var * self.config.confid_mult | |
2202 | + t1 = mean + var * self.config.confid_mult | |
2193 | 2203 | |
2194 | - floodfill.floodfill_threshold(image, [[x, y, 0]], t0, t1, 1, bstruct, out_mask) | |
2204 | + print self.config.confid_iters, self.config.confid_mult | |
2205 | + | |
2206 | + floodfill.floodfill_threshold(image, [[x, y, z]], t0, t1, 1, bstruct, out_mask) | |
2195 | 2207 | |
2196 | 2208 | bool_mask[out_mask == 1] = True |
2197 | 2209 | ... | ... |
invesalius/gui/dialogs.py
... | ... | @@ -2031,6 +2031,64 @@ class PanelFFillDynamic(wx.Panel): |
2031 | 2031 | self.config.dev_min = self.deviation_min.GetValue() |
2032 | 2032 | |
2033 | 2033 | |
2034 | +class PanelFFillConfidence(wx.Panel): | |
2035 | + def __init__(self, parent, config, ID=-1, style=wx.TAB_TRAVERSAL|wx.NO_BORDER): | |
2036 | + wx.Panel.__init__(self, parent, ID, style=style) | |
2037 | + | |
2038 | + self.config = config | |
2039 | + | |
2040 | + self._init_gui() | |
2041 | + | |
2042 | + def _init_gui(self): | |
2043 | + self.use_ww_wl = wx.CheckBox(self, -1, _(u"Use WW&WL")) | |
2044 | + self.use_ww_wl.SetValue(self.config.use_ww_wl) | |
2045 | + | |
2046 | + self.spin_mult = floatspin.FloatSpin(self, -1, | |
2047 | + value=self.config.confid_mult, | |
2048 | + min_val=1.0, max_val=10.0, | |
2049 | + increment=0.1, digits=1, | |
2050 | + style=wx.TE_PROCESS_TAB|wx.TE_PROCESS_ENTER, | |
2051 | + agwStyle=floatspin.FS_RIGHT) | |
2052 | + w, h = self.spin_mult.GetTextExtent('M') | |
2053 | + self.spin_mult.SetMinSize((w*7, -1)) | |
2054 | + | |
2055 | + self.spin_iters = wx.SpinCtrl(self, -1, value='%d' % self.config.confid_iters, min=0, max=100) | |
2056 | + self.spin_iters.SetMinSize((w*7, -1)) | |
2057 | + | |
2058 | + sizer = wx.GridBagSizer(5, 5) | |
2059 | + | |
2060 | + sizer.AddStretchSpacer((0, 0)) | |
2061 | + | |
2062 | + sizer.Add(self.use_ww_wl, (1, 0), (1, 6), flag=wx.LEFT, border=5) | |
2063 | + | |
2064 | + sizer.AddStretchSpacer((2, 0)) | |
2065 | + | |
2066 | + sizer.Add(wx.StaticText(self, -1, _(u"Multiplier")), (3, 0), (1, 3), flag=wx.ALIGN_CENTER_VERTICAL|wx.LEFT, border=5) | |
2067 | + sizer.Add(self.spin_mult, (3, 3), (1, 2)) | |
2068 | + | |
2069 | + sizer.Add(wx.StaticText(self, -1, _(u"Iterations")), (4, 0), (1, 3), flag=wx.ALIGN_CENTER_VERTICAL|wx.LEFT, border=5) | |
2070 | + sizer.Add(self.spin_iters, (4, 3), (1, 2)) | |
2071 | + | |
2072 | + sizer.AddStretchSpacer((5, 0)) | |
2073 | + | |
2074 | + self.SetSizer(sizer) | |
2075 | + sizer.Fit(self) | |
2076 | + self.Layout() | |
2077 | + | |
2078 | + self.use_ww_wl.Bind(wx.EVT_CHECKBOX, self.OnSetUseWWWL) | |
2079 | + self.spin_mult.Bind(wx.EVT_SPINCTRL, self.OnSetMult) | |
2080 | + self.spin_iters.Bind(wx.EVT_SPINCTRL, self.OnSetIters) | |
2081 | + | |
2082 | + def OnSetUseWWWL(self, evt): | |
2083 | + self.config.use_ww_wl = self.use_ww_wl.GetValue() | |
2084 | + | |
2085 | + def OnSetMult(self, evt): | |
2086 | + self.config.confid_mult = self.spin_mult.GetValue() | |
2087 | + | |
2088 | + def OnSetIters(self, evt): | |
2089 | + self.config.confid_iters = self.spin_iters.GetValue() | |
2090 | + | |
2091 | + | |
2034 | 2092 | class FFillOptionsDialog(wx.Dialog): |
2035 | 2093 | def __init__(self, title, config): |
2036 | 2094 | pre = wx.PreDialog() |
... | ... | @@ -2290,6 +2348,10 @@ class FFillSegmentationOptionsDialog(wx.Dialog): |
2290 | 2348 | self.panel_ffill_dynamic.SetMinSize((250, -1)) |
2291 | 2349 | self.panel_ffill_dynamic.Hide() |
2292 | 2350 | |
2351 | + self.panel_ffill_confidence = PanelFFillConfidence(self, self.config, -1, style=border_style|wx.TAB_TRAVERSAL) | |
2352 | + self.panel_ffill_confidence.SetMinSize((250, -1)) | |
2353 | + self.panel_ffill_confidence.Hide() | |
2354 | + | |
2293 | 2355 | self.close_btn = wx.Button(self, wx.ID_CLOSE) |
2294 | 2356 | |
2295 | 2357 | # Sizer |
... | ... | @@ -2316,8 +2378,8 @@ class FFillSegmentationOptionsDialog(wx.Dialog): |
2316 | 2378 | sizer.Add(self.panel_ffill_dynamic, (11, 0), (1, 6), flag=wx.LEFT|wx.RIGHT|wx.EXPAND, border=7) |
2317 | 2379 | elif self.config.method == 'confidence': |
2318 | 2380 | 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) | |
2381 | + self.panel_ffill_confidence.Show() | |
2382 | + sizer.Add(self.panel_ffill_confidence, (11, 0), (1, 6), flag=wx.LEFT|wx.RIGHT|wx.EXPAND, border=7) | |
2321 | 2383 | else: |
2322 | 2384 | self.cmb_method.SetSelection(1) |
2323 | 2385 | self.panel_ffill_threshold.Show() |
... | ... | @@ -2363,21 +2425,25 @@ class FFillSegmentationOptionsDialog(wx.Dialog): |
2363 | 2425 | self.config.con_3d = 26 |
2364 | 2426 | |
2365 | 2427 | def OnSetMethod(self, evt): |
2428 | + item_panel = self.GetSizer().FindItemAtPosition((11, 0)).GetWindow() | |
2429 | + | |
2366 | 2430 | if self.cmb_method.GetSelection() == 0: |
2367 | 2431 | self.config.method = 'dynamic' |
2368 | - self.panel_ffill_threshold.Hide() | |
2432 | + item_panel.Hide() | |
2369 | 2433 | self.panel_ffill_dynamic.Show() |
2370 | - self.GetSizer().Replace(self.panel_ffill_threshold, self.panel_ffill_dynamic) | |
2434 | + self.GetSizer().Replace(item_panel, self.panel_ffill_dynamic) | |
2435 | + | |
2371 | 2436 | elif self.cmb_method.GetSelection() == 2: |
2372 | 2437 | 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) | |
2438 | + item_panel.Hide() | |
2439 | + self.panel_ffill_confidence.Show() | |
2440 | + self.GetSizer().Replace(item_panel, self.panel_ffill_confidence) | |
2441 | + | |
2376 | 2442 | else: |
2377 | 2443 | self.config.method = 'threshold' |
2378 | - self.panel_ffill_dynamic.Hide() | |
2444 | + item_panel.Hide() | |
2379 | 2445 | self.panel_ffill_threshold.Show() |
2380 | - self.GetSizer().Replace(self.panel_ffill_dynamic, self.panel_ffill_threshold) | |
2446 | + self.GetSizer().Replace(item_panel, self.panel_ffill_threshold) | |
2381 | 2447 | |
2382 | 2448 | self.GetSizer().Fit(self) |
2383 | 2449 | self.Layout() | ... | ... |