Commit 1b2d60347e197d3eca70741aa8bba2de45c92a4a
1 parent
b8a2a2a8
Exists in
smoothing_bin
tests
Showing
3 changed files
with
50 additions
and
20 deletions
Show diff stats
invesalius/data/smooth_cy.pyx
| ... | ... | @@ -118,7 +118,7 @@ def smooth(np.ndarray[DTYPE8_t, ndim=3] image, |
| 118 | 118 | cdef np.ndarray[DTYPE8_t, ndim=3] _mask = np.zeros_like(image) |
| 119 | 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 | 122 | cdef DTYPEF64_t H, v, cn |
| 123 | 123 | cdef DTYPEF64_t diff=0.0 |
| 124 | 124 | cdef DTYPEF64_t dt=1/6.0 |
| ... | ... | @@ -152,31 +152,31 @@ def smooth(np.ndarray[DTYPE8_t, ndim=3] image, |
| 152 | 152 | S += 1 |
| 153 | 153 | |
| 154 | 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 | 158 | for z in xrange(dz): |
| 159 | 159 | for y in xrange(dy): |
| 160 | 160 | for x in xrange(dx): |
| 161 | 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 | 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 | 166 | if v < 0: |
| 167 | + out[z, y, x] = 0.0 | |
| 168 | + else: | |
| 172 | 169 | out[z, y, x] = v |
| 170 | + else: | |
| 171 | + if v > 0: | |
| 172 | + out[z, y, x] = 0.0 | |
| 173 | 173 | else: |
| 174 | - out[z, y, x] = -0.0001 | |
| 174 | + out[z, y, x] = v | |
| 175 | 175 | |
| 176 | 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 | 179 | print "%d - CN: %.28f - diff: %.28f\n" % (i, cn, diff) |
| 180 | 180 | |
| 181 | 181 | if cn <= E: |
| 182 | - break; | |
| 182 | + break | ... | ... |
invesalius/data/surface.py
| ... | ... | @@ -472,11 +472,9 @@ class SurfaceManager(): |
| 472 | 472 | iteractions = 10 |
| 473 | 473 | bsize = 4 |
| 474 | 474 | mask_tfile = tempfile.mktemp() |
| 475 | + | |
| 475 | 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 | 479 | else: |
| 482 | 480 | mask_tfile = mask.temp_file |
| ... | ... | @@ -592,6 +590,38 @@ class SurfaceManager(): |
| 592 | 590 | # polydata.SetSource(None) |
| 593 | 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 | 625 | else: |
| 596 | 626 | #smoother = vtk.vtkWindowedSincPolyDataFilter() |
| 597 | 627 | smoother = vtk.vtkSmoothPolyDataFilter() | ... | ... |
invesalius/data/surface_process.py
| ... | ... | @@ -158,9 +158,9 @@ class SurfaceProcess(multiprocessing.Process): |
| 158 | 158 | else: |
| 159 | 159 | contour.SetValue(0, self.min_value) # initial threshold |
| 160 | 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 | 164 | contour.ReleaseDataFlagOn() |
| 165 | 165 | contour.Update() |
| 166 | 166 | #contour.AddObserver("ProgressEvent", lambda obj,evt: | ... | ... |