Commit aa28a9baa1865589cd5095e64cf7f384f015eded

Authored by Thiago Franco de Moraes
1 parent 0472084d
Exists in smoothing_bin_pll

tests

invesalius/data/smooth_cy.pyx
@@ -118,7 +118,7 @@ def smooth(np.ndarray[DTYPE8_t, ndim=3] image, @@ -118,7 +118,7 @@ def smooth(np.ndarray[DTYPE8_t, ndim=3] image,
118 cdef np.ndarray[DTYPE8_t, ndim=3] _mask = np.zeros_like(image) 118 cdef np.ndarray[DTYPE8_t, ndim=3] _mask = np.zeros_like(image)
119 cdef np.ndarray[DTYPEF64_t, ndim=3] aux = np.zeros_like(out) 119 cdef np.ndarray[DTYPEF64_t, ndim=3] aux = np.zeros_like(out)
120 120
121 - cdef int i, x, y, z, S; 121 + cdef int i, x, y, z, S
122 cdef DTYPEF64_t H, v, cn 122 cdef DTYPEF64_t H, v, cn
123 cdef DTYPEF64_t diff=0.0 123 cdef DTYPEF64_t diff=0.0
124 cdef DTYPEF64_t dt=1/6.0 124 cdef DTYPEF64_t dt=1/6.0
@@ -152,31 +152,31 @@ def smooth(np.ndarray[DTYPE8_t, ndim=3] image, @@ -152,31 +152,31 @@ def smooth(np.ndarray[DTYPE8_t, ndim=3] image,
152 S += 1 152 S += 1
153 153
154 for i in xrange(n): 154 for i in xrange(n):
155 - replicate(out, aux);  
156 - diff = 0.0; 155 + replicate(out, aux)
  156 + diff = 0.0
157 157
158 for z in xrange(dz): 158 for z in xrange(dz):
159 for y in xrange(dy): 159 for y in xrange(dy):
160 for x in xrange(dx): 160 for x in xrange(dx):
161 if mask[z, y, x]: 161 if mask[z, y, x]:
162 - H = calculate_H(aux, z, y, x);  
163 - v = aux[z, y, x] + dt*H; 162 + H = calculate_H(aux, z, y, x)
  163 + v = aux[z, y, x] + dt*H
164 164
165 if image[z, y, x]: 165 if image[z, y, x]:
166 - if v > 0:  
167 - out[z, y, x] = v  
168 - else:  
169 - out[z, y, x] = 0.0001  
170 - else:  
171 if v < 0: 166 if v < 0:
  167 + out[z, y, x] = 0.0
  168 + else:
172 out[z, y, x] = v 169 out[z, y, x] = v
  170 + else:
  171 + if v > 0:
  172 + out[z, y, x] = 0.0
173 else: 173 else:
174 - out[z, y, x] = -0.0001 174 + out[z, y, x] = v
175 175
176 diff += (out[z, y, x] - aux[z, y, x])*(out[z, y, x] - aux[z, y, x]) 176 diff += (out[z, y, x] - aux[z, y, x])*(out[z, y, x] - aux[z, y, x])
177 177
178 - cn = sqrt((1.0/S) * diff); 178 + cn = sqrt((1.0/S) * diff)
179 print "%d - CN: %.28f - diff: %.28f\n" % (i, cn, diff) 179 print "%d - CN: %.28f - diff: %.28f\n" % (i, cn, diff)
180 180
181 if cn <= E: 181 if cn <= E:
182 - break; 182 + break
invesalius/data/surface.py
@@ -472,11 +472,9 @@ class SurfaceManager(): @@ -472,11 +472,9 @@ class SurfaceManager():
472 iteractions = 10 472 iteractions = 10
473 bsize = 4 473 bsize = 4
474 mask_tfile = tempfile.mktemp() 474 mask_tfile = tempfile.mktemp()
  475 +
475 mmask = np.memmap(mask_tfile, shape=mask.matrix.shape, dtype='float64', mode='w+') 476 mmask = np.memmap(mask_tfile, shape=mask.matrix.shape, dtype='float64', mode='w+')
476 - smooth_cy.smooth(mask.matrix, iteractions, bsize, mmask)  
477 - mmask[0, :, :] = -1  
478 - mmask[:, 0, :] = -1  
479 - mmask[:, :, 0] = -1 477 + smooth_cy.smooth((mask.matrix > 127).astype('uint8'), iteractions, bsize, mmask)
480 478
481 else: 479 else:
482 mask_tfile = mask.temp_file 480 mask_tfile = mask.temp_file
@@ -592,6 +590,38 @@ class SurfaceManager(): @@ -592,6 +590,38 @@ class SurfaceManager():
592 # polydata.SetSource(None) 590 # polydata.SetSource(None)
593 # polydata.DebugOn() 591 # polydata.DebugOn()
594 592
  593 + elif algorithm == 'Whitaker':
  594 + normals = vtk.vtkPolyDataNormals()
  595 + normals_ref = weakref.ref(normals)
  596 + normals_ref().AddObserver("ProgressEvent", lambda obj,evt:
  597 + UpdateProgress(normals_ref(), _("Creating 3D surface...")))
  598 + normals.SetInput(polydata)
  599 + normals.ReleaseDataFlagOn()
  600 + #normals.SetFeatureAngle(80)
  601 + #normals.AutoOrientNormalsOn()
  602 + normals.ComputeCellNormalsOn()
  603 + normals.GetOutput().ReleaseDataFlagOn()
  604 + normals.Update()
  605 + del polydata
  606 + polydata = normals.GetOutput()
  607 + polydata.SetSource(None)
  608 + del normals
  609 +
  610 + clean = vtk.vtkCleanPolyData()
  611 + clean.ReleaseDataFlagOn()
  612 + clean.GetOutput().ReleaseDataFlagOn()
  613 + clean_ref = weakref.ref(clean)
  614 + clean_ref().AddObserver("ProgressEvent", lambda obj,evt:
  615 + UpdateProgress(clean_ref(), _("Creating 3D surface...")))
  616 + clean.SetInput(polydata)
  617 + clean.PointMergingOn()
  618 + clean.Update()
  619 +
  620 + del polydata
  621 + polydata = clean.GetOutput()
  622 + polydata.SetSource(None)
  623 + del clean
  624 +
595 else: 625 else:
596 #smoother = vtk.vtkWindowedSincPolyDataFilter() 626 #smoother = vtk.vtkWindowedSincPolyDataFilter()
597 smoother = vtk.vtkSmoothPolyDataFilter() 627 smoother = vtk.vtkSmoothPolyDataFilter()
invesalius/data/surface_process.py
@@ -158,9 +158,9 @@ class SurfaceProcess(multiprocessing.Process): @@ -158,9 +158,9 @@ class SurfaceProcess(multiprocessing.Process):
158 else: 158 else:
159 contour.SetValue(0, self.min_value) # initial threshold 159 contour.SetValue(0, self.min_value) # initial threshold
160 contour.SetValue(1, self.max_value) # final threshold 160 contour.SetValue(1, self.max_value) # final threshold
161 - contour.ComputeScalarsOn()  
162 - contour.ComputeGradientsOn()  
163 - contour.ComputeNormalsOn() 161 + # contour.ComputeScalarsOn()
  162 + # contour.ComputeGradientsOn()
  163 + # contour.ComputeNormalsOn()
164 contour.ReleaseDataFlagOn() 164 contour.ReleaseDataFlagOn()
165 contour.Update() 165 contour.Update()
166 #contour.AddObserver("ProgressEvent", lambda obj,evt: 166 #contour.AddObserver("ProgressEvent", lambda obj,evt: