Commit 75509c1def55c2fdf255c0c1a262d153d3bdb259

Authored by Thiago Franco de Moraes
1 parent 3e848453
Exists in ff_mask

Using c++ deque and struct

Showing 1 changed file with 33 additions and 38 deletions   Show diff stats
invesalius/data/floodfill.pyx
... ... @@ -6,9 +6,18 @@ from collections import deque
6 6  
7 7 from libc.math cimport floor, ceil
8 8 from libcpp.deque cimport deque as cdeque
  9 +from libcpp.vector cimport vector
9 10  
10 11 from cy_my_types cimport image_t, mask_t
11 12  
  13 +cdef struct s_coord:
  14 + int x
  15 + int y
  16 + int z
  17 +
  18 +ctypedef s_coord coord
  19 +
  20 +
12 21 @cython.boundscheck(False) # turn of bounds-checking for entire function
13 22 @cython.wraparound(False)
14 23 @cython.nonecheck(False)
... ... @@ -81,7 +90,7 @@ def floodfill(np.ndarray[image_t, ndim=3] data, int i, int j, int k, int v, int
81 90 @cython.boundscheck(False) # turn of bounds-checking for entire function
82 91 @cython.wraparound(False)
83 92 @cython.nonecheck(False)
84   -def floodfill_threshold(np.ndarray[image_t, ndim=3] data, list seeds, int t0, int t1, int fill, tuple neighbor_iter, np.ndarray[mask_t, ndim=3] out):
  93 +def floodfill_threshold(np.ndarray[image_t, ndim=3] data, list seeds, int t0, int t1, int fill, vector[vector[int]] neighbor_iter, np.ndarray[mask_t, ndim=3] out):
85 94  
86 95 cdef int to_return = 0
87 96 if out is None:
... ... @@ -92,53 +101,39 @@ def floodfill_threshold(np.ndarray[image_t, ndim=3] data, list seeds, int t0, in
92 101 cdef int xd, yd, zd
93 102 cdef int w, h, d
94 103 cdef int xo, yo, zo
  104 + cdef int i
95 105  
96 106 d = data.shape[0]
97 107 h = data.shape[1]
98 108 w = data.shape[2]
99 109  
100   - stack = deque()
  110 + cdef cdeque[coord] stack
  111 + cdef coord c
101 112  
102 113 for i, j, k in seeds:
103 114 if data[k, j, i] >= t0 and data[k, j, i] <= t1:
104   - stack.append((i, j, k))
  115 + c.x = i
  116 + c.y = j
  117 + c.z = k
  118 + stack.push_back(c)
105 119 out[k, j, i] = fill
106 120  
107   - while stack:
108   - x, y, z = stack.pop()
109   -
110   -
111   - for xd, yd, zd in neighbor_iter:
112   - xo = x + xd
113   - yo = y + yd
114   - zo = z + zd
115   - if 0 <= (x + xd) < w and 0 <= (y + yd) < h and 0 <= (z + zd) < d and out[zo, yo, xo] != fill and t0 <= data[zo, yo, xo] <= t1:
116   - out[zo, yo, xo] = fill
117   - stack.append((xo, yo, zo))
118   -
119   - # if z + 1 < d and data[z + 1, y, x] >= t0 and data[z + 1, y, x] <= t1 and out[zo + 1, yo, xo] != fill:
120   - # out[zo + 1, yo, xo] = fill
121   - # stack.append((x, y, z + 1))
122   -
123   - # if z - 1 >= 0 and data[z - 1, y, x] >= t0 and data[z - 1, y, x] <= t1 and out[zo - 1, yo, xo] != fill:
124   - # out[zo - 1, yo, xo] = fill
125   - # stack.append((x, y, z - 1))
126   -
127   - # if y + 1 < h and data[z, y + 1, x] >= t0 and data[z, y + 1, x] <= t1 and out[zo, yo + 1, xo] != fill:
128   - # out[zo, yo + 1, xo] = fill
129   - # stack.append((x, y + 1, z))
130   -
131   - # if y - 1 >= 0 and data[z, y - 1, x] >= t0 and data[z, y - 1, x] <= t1 and out[zo, yo - 1, xo] != fill:
132   - # out[zo, yo - 1, xo] = fill
133   - # stack.append((x, y - 1, z))
134   -
135   - # if x + 1 < w and data[z, y, x + 1] >= t0 and data[z, y, x + 1] <= t1 and out[zo, yo, xo + 1] != fill:
136   - # out[zo, yo, xo + 1] = fill
137   - # stack.append((x + 1, y, z))
138   -
139   - # if x - 1 >= 0 and data[z, y, x - 1] >= t0 and data[z, y, x - 1] <= t1 and out[zo, yo, xo - 1] != fill:
140   - # out[zo, yo, xo - 1] = fill
141   - # stack.append((x - 1, y, z))
  121 + with nogil:
  122 + while stack.size():
  123 + c = stack.front()
  124 + stack.pop_front()
  125 +
  126 + for i in xrange(neighbor_iter.size()):
  127 + xo = c.x + neighbor_iter[i][0]
  128 + yo = c.y + neighbor_iter[i][1]
  129 + zo = c.z + neighbor_iter[i][2]
  130 +
  131 + if 0 <= xo < w and 0 <= yo < h and 0 <= zo < d and out[zo, yo, xo] != fill and t0 <= data[zo, yo, xo] <= t1:
  132 + out[zo, yo, xo] = fill
  133 + c.x = xo
  134 + c.y = yo
  135 + c.z = zo
  136 + stack.push_back(c)
142 137  
143 138 if to_return:
144 139 return out
... ...