Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/core/python/itkwasm/itkwasm/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
"""itkwasm: Python interface to itk-wasm WebAssembly modules."""

__version__ = "1.0b191"
__version__ = "1.0b193"

from .interface_types import InterfaceTypes
from .image import Image, ImageType, ImageRegion
Expand Down
26 changes: 19 additions & 7 deletions packages/core/python/itkwasm/itkwasm/image.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,15 @@ class ImageRegion:
@dataclass
class Image:
imageType: Union[ImageType, Dict] = field(default_factory=ImageType)

name: str = "Image"

origin: Sequence[float] = field(default_factory=list)
spacing: Sequence[float] = field(default_factory=list)
direction: ArrayLike = field(default_factory=_default_direction)

size: Sequence[int] = field(default_factory=list)

metadata: Dict = field(default_factory=dict)
data: Optional[ArrayLike] = None
bufferedRegion: Optional[ImageRegion] = None
Expand Down Expand Up @@ -67,10 +71,18 @@ def __post_init__(self):
] * dimension

if self.bufferedRegion is None:
self.bufferedRegion = ImageRegion(
index=[
0,
]
* dimension,
size=self.size,
)
if self.data is not None:
self.bufferedRegion = ImageRegion(
index=(0,) * dimension,
size=self.data.shape[:dimension][::-1],
)
else:
self.bufferedRegion = ImageRegion(
index=[
0,
]
* dimension,
size=self.size,
)
elif isinstance(self.bufferedRegion, dict):
self.bufferedRegion = ImageRegion(**self.bufferedRegion)
6 changes: 5 additions & 1 deletion packages/core/python/itkwasm/itkwasm/image_from_array.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
except ImportError:
from numpy import ndarray as ArrayLike

from .image import Image, ImageType
from .image import Image, ImageType, ImageRegion
from .to_numpy_array import _dtype_to_component_type

from .pixel_types import PixelTypes
Expand Down Expand Up @@ -42,5 +42,9 @@ def image_from_array(arr, is_vector: bool = False, image_type: Optional[ImageTyp
image = Image(imageType=image_type)
image.size = arr.shape[:dimension][::-1]
image.data = arr
image.bufferedRegion = ImageRegion(
index=(0,) * dimension,
size=image.size,
)

return image
2,762 changes: 1,224 additions & 1,538 deletions packages/core/python/itkwasm/pixi.lock

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion packages/core/python/itkwasm/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ build-backend = "hatchling.build"
[project]
name = "itkwasm"
description = "Python interface to itk-wasm WebAssembly (Wasm) modules."
authors = [{name = "Matt McCormick", email = "matt@mmmccormick.com"}]
authors = [{name = "Matt McCormick", email = "matt@fideus.io"}]
readme = "README.md"
license = {file = "LICENSE"}
classifiers = [
Expand Down
43 changes: 42 additions & 1 deletion packages/core/python/itkwasm/test/test_image.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import itk

from itkwasm import Image
from itkwasm import Image, ImageType
from dataclasses import asdict
import numpy as np

Expand All @@ -12,6 +12,10 @@ def test_image():
itk_image = itk.imread(data, itk.UC)
itk_image_dict = itk.dict_from_image(itk_image)
itkwasm_image = Image(**itk_image_dict)
assert itkwasm_image.bufferedRegion.index[0] == 0
assert itkwasm_image.bufferedRegion.index[1] == 0
assert itkwasm_image.bufferedRegion.size[0] == 256
assert itkwasm_image.bufferedRegion.size[1] == 256
itkwasm_image_dict = asdict(itkwasm_image)
itk_image_roundtrip = itk.image_from_dict(itkwasm_image_dict)
difference = np.sum(itk.comparison_image_filter(itk_image, itk_image_roundtrip))
Expand All @@ -38,3 +42,40 @@ def test_image_defaults():

assert isinstance(image.metadata, dict)
assert image.data == None

def test_image_with_data():
"""Test creating an Image with data."""
image_type = ImageType(
dimension=2,
componentType="uint8",
pixelType="Scalar",
components=1,
)
data = np.zeros((5, 6), dtype=np.uint8)

image = Image(
imageType=image_type,
data=data,
)

assert image.imageType.dimension == 2
assert image.imageType.componentType == "uint8"
assert image.imageType.pixelType == "Scalar"
assert image.imageType.components == 1

assert image.name == "Image"
assert image.origin[0] == 0.0
assert image.origin[1] == 0.0
assert image.spacing[0] == 1.0
assert image.spacing[1] == 1.0
assert np.array_equal(image.direction, np.eye(2).astype(np.float64))

assert image.size[0] == 1
assert image.size[1] == 1

assert isinstance(image.metadata, dict)
assert np.array_equal(image.data, data)
assert image.bufferedRegion.index[0] == 0
assert image.bufferedRegion.index[1] == 0
assert image.bufferedRegion.size[0] == 6
assert image.bufferedRegion.size[1] == 5
13 changes: 13 additions & 0 deletions packages/core/python/itkwasm/test/test_image_from_array.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,3 +50,16 @@ def test_image_from_array_explicit():
assert image.imageType.componentType == FloatTypes.Float32
assert image.imageType.pixelType == PixelTypes.VariableLengthVector
assert image.imageType.components == 3

def test_image_from_array_buffered_region():
arr = np.random.rand(9, 9, 3)
image = image_from_array(arr, is_vector=True)
assert np.array_equal(arr, image.data)
assert image.imageType.dimension == 2
assert image.imageType.componentType == FloatTypes.Float64
assert image.imageType.pixelType == PixelTypes.VariableLengthVector
assert image.imageType.components == 3
assert image.bufferedRegion.index[0] == 0
assert image.bufferedRegion.index[1] == 0
assert image.bufferedRegion.size[0] == 9
assert image.bufferedRegion.size[1] == 9
1 change: 1 addition & 0 deletions packages/core/python/itkwasm/test/test_polydata.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from dataclasses import asdict

from itkwasm import PolyData
import itkwasm


def test_polydata():
Expand Down
Loading