Commit cf46a8eba084b51ebe36e88625c1e7ec3051bf0e
1 parent
6d417076
Exists in
fill_holes_auto
added ctrl-z and ctrl-y
Showing
3 changed files
with
12 additions
and
18 deletions
Show diff stats
invesalius/data/floodfill.pyx
@@ -233,9 +233,9 @@ def floodfill_auto_threshold(np.ndarray[image_t, ndim=3] data, list seeds, float | @@ -233,9 +233,9 @@ def floodfill_auto_threshold(np.ndarray[image_t, ndim=3] data, list seeds, float | ||
233 | return out | 233 | return out |
234 | 234 | ||
235 | 235 | ||
236 | -# @cython.boundscheck(False) | ||
237 | -# @cython.wraparound(False) | ||
238 | -# @cython.nonecheck(False) | 236 | +@cython.boundscheck(False) |
237 | +@cython.wraparound(False) | ||
238 | +@cython.nonecheck(False) | ||
239 | def fill_holes_automatically(np.ndarray[mask_t, ndim=3] mask, np.ndarray[np.uint16_t, ndim=3] labels, unsigned int nlabels, unsigned int max_size): | 239 | def fill_holes_automatically(np.ndarray[mask_t, ndim=3] mask, np.ndarray[np.uint16_t, ndim=3] labels, unsigned int nlabels, unsigned int max_size): |
240 | cdef np.ndarray[np.uint32_t, ndim=1] sizes = np.zeros(shape=(nlabels + 1), dtype=np.uint32) | 240 | cdef np.ndarray[np.uint32_t, ndim=1] sizes = np.zeros(shape=(nlabels + 1), dtype=np.uint32) |
241 | cdef int x, y, z | 241 | cdef int x, y, z |
invesalius/data/mask.py
@@ -347,11 +347,15 @@ class Mask(): | @@ -347,11 +347,15 @@ class Mask(): | ||
347 | CON3D = {6: 1, 18: 2, 26: 3} | 347 | CON3D = {6: 1, 18: 2, 26: 3} |
348 | 348 | ||
349 | if target == '3D': | 349 | if target == '3D': |
350 | + cp_mask = self.matrix.copy() | ||
350 | matrix = self.matrix[1:, 1:, 1:] | 351 | matrix = self.matrix[1:, 1:, 1:] |
351 | bstruct = ndimage.generate_binary_structure(3, CON3D[conn]) | 352 | bstruct = ndimage.generate_binary_structure(3, CON3D[conn]) |
352 | 353 | ||
353 | imask = (~(matrix > 127)) | 354 | imask = (~(matrix > 127)) |
354 | labels, nlabels = ndimage.label(imask, bstruct, output=np.uint16) | 355 | labels, nlabels = ndimage.label(imask, bstruct, output=np.uint16) |
356 | + print ">>>>", nlabels | ||
357 | + floodfill.fill_holes_automatically(matrix, labels, nlabels, size) | ||
358 | + self.save_history(index, orientation, self.matrix.copy(), cp_mask) | ||
355 | else: | 359 | else: |
356 | bstruct = ndimage.generate_binary_structure(2, CON2D[conn]) | 360 | bstruct = ndimage.generate_binary_structure(2, CON2D[conn]) |
357 | 361 | ||
@@ -362,24 +366,16 @@ class Mask(): | @@ -362,24 +366,16 @@ class Mask(): | ||
362 | elif orientation == 'SAGITAL': | 366 | elif orientation == 'SAGITAL': |
363 | matrix = self.matrix[1:, 1:, index+1] | 367 | matrix = self.matrix[1:, 1:, index+1] |
364 | 368 | ||
369 | + cp_mask = matrix.copy() | ||
370 | + | ||
365 | imask = (~(matrix > 127)) | 371 | imask = (~(matrix > 127)) |
366 | labels, nlabels = ndimage.label(imask, bstruct, output=np.uint16) | 372 | labels, nlabels = ndimage.label(imask, bstruct, output=np.uint16) |
367 | 373 | ||
368 | labels = labels.reshape(1, labels.shape[0], labels.shape[1]) | 374 | labels = labels.reshape(1, labels.shape[0], labels.shape[1]) |
369 | matrix = matrix.reshape(1, matrix.shape[0], matrix.shape[1]) | 375 | matrix = matrix.reshape(1, matrix.shape[0], matrix.shape[1]) |
370 | 376 | ||
371 | - | ||
372 | - floodfill.fill_holes_automatically(matrix, labels, nlabels, size) | ||
373 | - | ||
374 | - # for l in xrange(nlabels): | ||
375 | - # trues = (labels == l) | ||
376 | - # size = trues.sum() | ||
377 | - # print l, size | ||
378 | - | ||
379 | - # if size <= 1000: | ||
380 | - # matrix[trues] = 254 | ||
381 | - # self.was_edited = True | ||
382 | - | 377 | + floodfill.fill_holes_automatically(matrix, labels, nlabels, size) |
378 | + self.save_history(index, orientation, matrix.copy(), cp_mask) | ||
383 | 379 | ||
384 | def __del__(self): | 380 | def __del__(self): |
385 | if self.is_shown: | 381 | if self.is_shown: |
invesalius/gui/dialogs.py
@@ -2528,8 +2528,6 @@ class FillHolesAutoDialog(wx.Dialog): | @@ -2528,8 +2528,6 @@ class FillHolesAutoDialog(wx.Dialog): | ||
2528 | self.panel2dcon.Enable(1) | 2528 | self.panel2dcon.Enable(1) |
2529 | self.panel3dcon.Enable(0) | 2529 | self.panel3dcon.Enable(0) |
2530 | 2530 | ||
2531 | - self.panel2dcon.conect2D_8.SetValue(1) | ||
2532 | - | ||
2533 | self.apply_btn = wx.Button(self, wx.ID_APPLY) | 2531 | self.apply_btn = wx.Button(self, wx.ID_APPLY) |
2534 | self.close_btn = wx.Button(self, wx.ID_CLOSE) | 2532 | self.close_btn = wx.Button(self, wx.ID_CLOSE) |
2535 | 2533 | ||
@@ -2570,7 +2568,7 @@ class FillHolesAutoDialog(wx.Dialog): | @@ -2570,7 +2568,7 @@ class FillHolesAutoDialog(wx.Dialog): | ||
2570 | else: | 2568 | else: |
2571 | target = "3D" | 2569 | target = "3D" |
2572 | conn = self.panel3dcon.GetConnSelected() | 2570 | conn = self.panel3dcon.GetConnSelected() |
2573 | - orientation = '' | 2571 | + orientation = 'VOLUME' |
2574 | 2572 | ||
2575 | data = { | 2573 | data = { |
2576 | 'target': target, | 2574 | 'target': target, |