Commit 75509c1def55c2fdf255c0c1a262d153d3bdb259
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 | ... | ... |