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 | 2052 | mask = self.viewer.slice_.buffer_slices[self.orientation].mask.copy() |
2053 | 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 | 2056 | dy, dx = image.shape |
2074 | 2057 | image = image.reshape((1, dy, dx)) |
2075 | 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 | 2093 | mask[out_mask.astype('bool')] = self.config.fill_value |
2139 | 2094 | |
... | ... | @@ -2199,6 +2154,41 @@ class FloodFillSegmentInteractorStyle(DefaultInteractorStyle): |
2199 | 2154 | |
2200 | 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 | 2192 | def get_style(style): |
2203 | 2193 | STYLES = { |
2204 | 2194 | const.STATE_DEFAULT: DefaultInteractorStyle, | ... | ... |
invesalius/gui/dialogs.py
... | ... | @@ -2273,13 +2273,14 @@ class FFillSegmentationOptionsDialog(wx.Dialog): |
2273 | 2273 | else: |
2274 | 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 | 2278 | if self.config.method == 'dynamic': |
2279 | 2279 | self.cmb_method.SetSelection(0) |
2280 | - else: | |
2280 | + elif self.config.method == 'threshold': | |
2281 | 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 | 2285 | self.panel_ffill_threshold = PanelFFillThreshold(self, self.config, -1, style=border_style|wx.TAB_TRAVERSAL) |
2285 | 2286 | self.panel_ffill_threshold.SetMinSize((250, -1)) |
... | ... | @@ -2313,6 +2314,10 @@ class FFillSegmentationOptionsDialog(wx.Dialog): |
2313 | 2314 | self.cmb_method.SetSelection(0) |
2314 | 2315 | self.panel_ffill_dynamic.Show() |
2315 | 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 | 2321 | else: |
2317 | 2322 | self.cmb_method.SetSelection(1) |
2318 | 2323 | self.panel_ffill_threshold.Show() |
... | ... | @@ -2363,6 +2368,11 @@ class FFillSegmentationOptionsDialog(wx.Dialog): |
2363 | 2368 | self.panel_ffill_threshold.Hide() |
2364 | 2369 | self.panel_ffill_dynamic.Show() |
2365 | 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 | 2376 | else: |
2367 | 2377 | self.config.method = 'threshold' |
2368 | 2378 | self.panel_ffill_dynamic.Hide() | ... | ... |