triangulation using original scalar data or voxel based

This commit is contained in:
Michael Krayer 2021-08-06 04:43:24 +02:00
parent c71f86a33b
commit 00128cc24e
1 changed files with 37 additions and 9 deletions

View File

@ -578,10 +578,10 @@ class Field3d:
mesh.point_arrays['data'] = self.data.ravel(order='F') mesh.point_arrays['data'] = self.data.ravel(order='F')
return mesh return mesh
def vtk_contour(self,val,deep=False): def vtk_contour(self,val,deep=False,method='contour'):
if not isinstance(val,(tuple,list)): if not isinstance(val,(tuple,list)):
val = [val] val = [val]
return self.to_vtk(deep=deep).contour(val) return self.to_vtk(deep=deep).contour(val,method=method)
def vtk_slice(self,normal,origin,deep=False): def vtk_slice(self,normal,origin,deep=False):
assert (normal in ('x','y','z') or (isinstance(normal,(tuple,list)) assert (normal in ('x','y','z') or (isinstance(normal,(tuple,list))
@ -795,18 +795,24 @@ class BinaryFieldNd:
self.wrap[axis] = self.wrap[axis][idx_] self.wrap[axis] = self.wrap[axis][idx_]
self.data = self.labels>0 self.data = self.labels>0
def isolate_feature(self,selection): def isolate_feature(self,selection,array=None):
from scipy import ndimage from scipy import ndimage
if self.labels is None: if self.labels is None:
self.label() self.label()
selection = self._select_feature(selection) selection = self._select_feature(selection)
output = [] output1 = []
has_array = array is not None
if has_array:
assert np.all(array.shape==self._dim)
output2 = []
for lab_ in selection: for lab_ in selection:
# Extract feature of interest # Extract feature of interest
if lab_==0: if lab_==0:
data_ = np.logical_not(self.data) data_ = np.logical_not(self.data)
if has_array: data2_ = array
else: else:
data_ = (self.labels[self._feat_slice[lab_-1]]==lab_) data_ = (self.labels[self._feat_slice[lab_-1]]==lab_)
if has_array: data2_ = array[self._feat_slice[lab_-1]]
# If feature is wrapped periodically, duplicate it and extract # If feature is wrapped periodically, duplicate it and extract
# largest one # largest one
iswrapped = False iswrapped = False
@ -822,20 +828,42 @@ class BinaryFieldNd:
il_ = np.argmax(vol_[1:])+1 il_ = np.argmax(vol_[1:])+1
sl_ = ndimage.find_objects(l_==il_)[0] sl_ = ndimage.find_objects(l_==il_)[0]
data_ = data_[sl_] data_ = data_[sl_]
if has_array:
data2_ = np.tile(data2_,rep_)[sl_]
# Add to output # Add to output
output.append(data_) output1.append(data_)
return output if has_array: output2.append(data2_)
if has_array:
return (output1,output2)
else:
return output1
def triangulate_feature(self,selection,origin=(0,0,0),spacing=(1,1,1)): def triangulate_feature(self,selection,origin=(0,0,0),spacing=(1,1,1),array=None):
assert self._ndim==3, "Triangulation requires 3D data." assert self._ndim==3, "Triangulation requires 3D data."
from scipy import ndimage
if self.labels is None: if self.labels is None:
self.label() self.label()
selection = self._select_feature(selection) selection = self._select_feature(selection)
output = [] output = []
pw = tuple((1,1) for ii in range(self._ndim)) pw = tuple((1,1) for ii in range(self._ndim))
has_array = array is not None
if has_array:
assert np.all(array.shape==self._dim)
output2 = []
for lab_ in selection: for lab_ in selection:
data_ = np.pad(self.isolate_feature(lab_)[0],pw,mode='constant') if has_array:
output.append(Field3d(data_,origin,spacing).vtk_contour(0.5)) data_,scal_ = self.isolate_feature(lab_,array=array)
data_,scal_ = data_[0],scal_[0]
# Fill interior in case we filled holes which is not in scal_
data_ = ndimage.binary_erosion(data_,structure=self.structure,iterations=2)
scal_[data_] = 1.0
scal_ = np.pad(scal_,pw,mode='reflect',reflect_type='odd')
pd = Field3d(scal_,origin,spacing).vtk_contour(0.0)
else:
data_ = self.isolate_feature(lab_)[0]
data_ = np.pad(data_.astype(float),pw,mode='constant',constant_values=-1.0)
pd = Field3d(data_,origin,spacing).vtk_contour(0.5).smooth(1000)
output.append(pd)
return output return output
def _select_feature(self,selection): def _select_feature(self,selection):