Binary file not shown.
@@ -3,6 +3,7 @@ import numpy as np
|
|||||||
|
|
||||||
from . import scipy
|
from . import scipy
|
||||||
from . import skimage as ski
|
from . import skimage as ski
|
||||||
|
from . import scipy as ndi
|
||||||
|
|
||||||
# 3rd-party
|
# 3rd-party
|
||||||
import transforms3d
|
import transforms3d
|
||||||
@@ -97,36 +98,43 @@ class Layer():
|
|||||||
_mask = np.expand_dims(_mask, axis=-1)
|
_mask = np.expand_dims(_mask, axis=-1)
|
||||||
self.data = _mask * value + (1-_mask) * self.data
|
self.data = _mask * value + (1-_mask) * self.data
|
||||||
|
|
||||||
def resize(self, shape:tuple, progress_callback=None):
|
def resize(self, shape: tuple, progress_callback=None):
|
||||||
if len(shape) != 3:
|
if len(shape) != 3:
|
||||||
raise Exception("Shape must be 3 dim")
|
raise Exception("Shape must be 3 dim")
|
||||||
|
|
||||||
data = self.data
|
data = self.data
|
||||||
|
order = 0 if self.dtype == bool else 1
|
||||||
|
|
||||||
# TXYZC > TXYZ
|
# TXYZC > TXYZ
|
||||||
if self.kind in ['label', 'scalar']:
|
if self.kind in ['label', 'scalar']:
|
||||||
data = np.amax(data, -1)
|
data = np.amax(data, -1)
|
||||||
|
|
||||||
if self.kind in ['scalar']:
|
# if self.kind in ['scalar']:
|
||||||
dtype = data.dtype
|
# dtype = data.dtype
|
||||||
data = data.astype(np.float32)
|
# data = data.astype(np.float32)
|
||||||
|
|
||||||
data_frames = ()
|
data_frames = ()
|
||||||
for f in range(self.frame_count):
|
for f in range(self.frame_count):
|
||||||
if progress_callback:
|
if progress_callback:
|
||||||
progress_callback(f, self.frame_count)
|
progress_callback(f, self.frame_count)
|
||||||
|
|
||||||
frame = ski.resize(data[f, :, :, :],
|
# frame = ski.resize(data[f, :, :, :],
|
||||||
shape,
|
# shape,
|
||||||
preserve_range=True,
|
# preserve_range=True,
|
||||||
anti_aliasing=data.dtype.kind != "b")
|
# anti_aliasing=data.dtype.kind != "b")
|
||||||
|
|
||||||
|
factors = np.divide(self.shape, shape)
|
||||||
|
zoom_factors = [1 / f for f in factors]
|
||||||
|
frame = ndi.zoom(data[f, :, :, :],
|
||||||
|
zoom_factors,
|
||||||
|
order=order)
|
||||||
|
|
||||||
data_frames += (frame,)
|
data_frames += (frame,)
|
||||||
|
|
||||||
data = np.stack(data_frames)
|
data = np.stack(data_frames)
|
||||||
|
|
||||||
if self.kind in ['scalar']:
|
# if self.kind in ['scalar']:
|
||||||
data = data.astype(dtype)
|
# data = data.astype(dtype)
|
||||||
|
|
||||||
# TXYZ > TXYZC
|
# TXYZ > TXYZC
|
||||||
if self.kind in ['label', 'scalar']:
|
if self.kind in ['label', 'scalar']:
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
schema_version = "1.0.0"
|
schema_version = "1.0.0"
|
||||||
|
|
||||||
id = "bioxelnodes"
|
id = "bioxelnodes"
|
||||||
version = "0.3.2"
|
version = "0.3.3"
|
||||||
name = "Bioxel Nodes"
|
name = "Bioxel Nodes"
|
||||||
tagline = "For scientific volumetric data visualization in Blender"
|
tagline = "For scientific volumetric data visualization in Blender"
|
||||||
maintainer = "Ma Nan <icrdr2010@outlook.com>"
|
maintainer = "Ma Nan <icrdr2010@outlook.com>"
|
||||||
|
|||||||
@@ -134,10 +134,12 @@ class ParseVolumetricData(bpy.types.Operator):
|
|||||||
filepath: bpy.props.StringProperty(subtype="FILE_PATH") # type: ignore
|
filepath: bpy.props.StringProperty(subtype="FILE_PATH") # type: ignore
|
||||||
|
|
||||||
skip_read_as: bpy.props.BoolProperty(name="Skip Read As",
|
skip_read_as: bpy.props.BoolProperty(name="Skip Read As",
|
||||||
default=False) # type: ignore
|
default=False,
|
||||||
|
options={"SKIP_SAVE"}) # type: ignore
|
||||||
|
|
||||||
skip_series_select: bpy.props.BoolProperty(name="Skip Sries Select",
|
skip_series_select: bpy.props.BoolProperty(name="Skip Sries Select",
|
||||||
default=True) # type: ignore
|
default=True,
|
||||||
|
options={"SKIP_SAVE"}) # type: ignore
|
||||||
|
|
||||||
read_as: bpy.props.EnumProperty(name="Read as",
|
read_as: bpy.props.EnumProperty(name="Read as",
|
||||||
default="scalar",
|
default="scalar",
|
||||||
|
|||||||
@@ -232,7 +232,6 @@ class CombineLabels(bpy.types.Operator, LabelOperator):
|
|||||||
return {'FINISHED'}
|
return {'FINISHED'}
|
||||||
base_obj = label_objs[0]
|
base_obj = label_objs[0]
|
||||||
label_objs = label_objs[1:]
|
label_objs = label_objs[1:]
|
||||||
container_obj = base_obj.parent
|
|
||||||
|
|
||||||
base_layer = obj_to_layer(base_obj)
|
base_layer = obj_to_layer(base_obj)
|
||||||
modified_layer = base_layer.copy()
|
modified_layer = base_layer.copy()
|
||||||
@@ -241,7 +240,7 @@ class CombineLabels(bpy.types.Operator, LabelOperator):
|
|||||||
for label_obj in label_objs:
|
for label_obj in label_objs:
|
||||||
label_layer = obj_to_layer(label_obj)
|
label_layer = obj_to_layer(label_obj)
|
||||||
label_layer.resize(base_layer.shape)
|
label_layer.resize(base_layer.shape)
|
||||||
modified_layer.data = np.maximum(base_layer.data, label_layer.data)
|
modified_layer.data = np.maximum(modified_layer.data, label_layer.data)
|
||||||
label_names.append(label_layer.name)
|
label_names.append(label_layer.name)
|
||||||
|
|
||||||
modified_layer.name = f"{'-'.join(label_names)}-Combined"
|
modified_layer.name = f"{'-'.join(label_names)}-Combined"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[tool.poetry]
|
[tool.poetry]
|
||||||
name = "bioxelnodes"
|
name = "bioxelnodes"
|
||||||
version = "0.3.2"
|
version = "0.3.3"
|
||||||
description = ""
|
description = ""
|
||||||
authors = ["Ma Nan <icrdr2010@outlook.com>"]
|
authors = ["Ma Nan <icrdr2010@outlook.com>"]
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
|
|||||||
Reference in New Issue
Block a user