Skip to content

Commit a473cb9

Browse files
authored
Merge pull request #1428 from thewtex/image-from-array-buffered-default
image from array buffered default
2 parents ceb51a7 + 71becbc commit a473cb9

File tree

8 files changed

+1306
-1549
lines changed

8 files changed

+1306
-1549
lines changed

packages/core/python/itkwasm/itkwasm/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""itkwasm: Python interface to itk-wasm WebAssembly modules."""
22

3-
__version__ = "1.0b191"
3+
__version__ = "1.0b193"
44

55
from .interface_types import InterfaceTypes
66
from .image import Image, ImageType, ImageRegion

packages/core/python/itkwasm/itkwasm/image.py

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,15 @@ class ImageRegion:
3434
@dataclass
3535
class Image:
3636
imageType: Union[ImageType, Dict] = field(default_factory=ImageType)
37+
3738
name: str = "Image"
39+
3840
origin: Sequence[float] = field(default_factory=list)
3941
spacing: Sequence[float] = field(default_factory=list)
4042
direction: ArrayLike = field(default_factory=_default_direction)
43+
4144
size: Sequence[int] = field(default_factory=list)
45+
4246
metadata: Dict = field(default_factory=dict)
4347
data: Optional[ArrayLike] = None
4448
bufferedRegion: Optional[ImageRegion] = None
@@ -67,10 +71,18 @@ def __post_init__(self):
6771
] * dimension
6872

6973
if self.bufferedRegion is None:
70-
self.bufferedRegion = ImageRegion(
71-
index=[
72-
0,
73-
]
74-
* dimension,
75-
size=self.size,
76-
)
74+
if self.data is not None:
75+
self.bufferedRegion = ImageRegion(
76+
index=(0,) * dimension,
77+
size=self.data.shape[:dimension][::-1],
78+
)
79+
else:
80+
self.bufferedRegion = ImageRegion(
81+
index=[
82+
0,
83+
]
84+
* dimension,
85+
size=self.size,
86+
)
87+
elif isinstance(self.bufferedRegion, dict):
88+
self.bufferedRegion = ImageRegion(**self.bufferedRegion)

packages/core/python/itkwasm/itkwasm/image_from_array.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
except ImportError:
66
from numpy import ndarray as ArrayLike
77

8-
from .image import Image, ImageType
8+
from .image import Image, ImageType, ImageRegion
99
from .to_numpy_array import _dtype_to_component_type
1010

1111
from .pixel_types import PixelTypes
@@ -42,5 +42,9 @@ def image_from_array(arr, is_vector: bool = False, image_type: Optional[ImageTyp
4242
image = Image(imageType=image_type)
4343
image.size = arr.shape[:dimension][::-1]
4444
image.data = arr
45+
image.bufferedRegion = ImageRegion(
46+
index=(0,) * dimension,
47+
size=image.size,
48+
)
4549

4650
return image

packages/core/python/itkwasm/pixi.lock

Lines changed: 1224 additions & 1538 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/core/python/itkwasm/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ build-backend = "hatchling.build"
55
[project]
66
name = "itkwasm"
77
description = "Python interface to itk-wasm WebAssembly (Wasm) modules."
8-
authors = [{name = "Matt McCormick", email = "matt@mmmccormick.com"}]
8+
authors = [{name = "Matt McCormick", email = "matt@fideus.io"}]
99
readme = "README.md"
1010
license = {file = "LICENSE"}
1111
classifiers = [

packages/core/python/itkwasm/test/test_image.py

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import itk
44

5-
from itkwasm import Image
5+
from itkwasm import Image, ImageType
66
from dataclasses import asdict
77
import numpy as np
88

@@ -12,6 +12,10 @@ def test_image():
1212
itk_image = itk.imread(data, itk.UC)
1313
itk_image_dict = itk.dict_from_image(itk_image)
1414
itkwasm_image = Image(**itk_image_dict)
15+
assert itkwasm_image.bufferedRegion.index[0] == 0
16+
assert itkwasm_image.bufferedRegion.index[1] == 0
17+
assert itkwasm_image.bufferedRegion.size[0] == 256
18+
assert itkwasm_image.bufferedRegion.size[1] == 256
1519
itkwasm_image_dict = asdict(itkwasm_image)
1620
itk_image_roundtrip = itk.image_from_dict(itkwasm_image_dict)
1721
difference = np.sum(itk.comparison_image_filter(itk_image, itk_image_roundtrip))
@@ -38,3 +42,40 @@ def test_image_defaults():
3842

3943
assert isinstance(image.metadata, dict)
4044
assert image.data == None
45+
46+
def test_image_with_data():
47+
"""Test creating an Image with data."""
48+
image_type = ImageType(
49+
dimension=2,
50+
componentType="uint8",
51+
pixelType="Scalar",
52+
components=1,
53+
)
54+
data = np.zeros((5, 6), dtype=np.uint8)
55+
56+
image = Image(
57+
imageType=image_type,
58+
data=data,
59+
)
60+
61+
assert image.imageType.dimension == 2
62+
assert image.imageType.componentType == "uint8"
63+
assert image.imageType.pixelType == "Scalar"
64+
assert image.imageType.components == 1
65+
66+
assert image.name == "Image"
67+
assert image.origin[0] == 0.0
68+
assert image.origin[1] == 0.0
69+
assert image.spacing[0] == 1.0
70+
assert image.spacing[1] == 1.0
71+
assert np.array_equal(image.direction, np.eye(2).astype(np.float64))
72+
73+
assert image.size[0] == 1
74+
assert image.size[1] == 1
75+
76+
assert isinstance(image.metadata, dict)
77+
assert np.array_equal(image.data, data)
78+
assert image.bufferedRegion.index[0] == 0
79+
assert image.bufferedRegion.index[1] == 0
80+
assert image.bufferedRegion.size[0] == 6
81+
assert image.bufferedRegion.size[1] == 5

packages/core/python/itkwasm/test/test_image_from_array.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,16 @@ def test_image_from_array_explicit():
5050
assert image.imageType.componentType == FloatTypes.Float32
5151
assert image.imageType.pixelType == PixelTypes.VariableLengthVector
5252
assert image.imageType.components == 3
53+
54+
def test_image_from_array_buffered_region():
55+
arr = np.random.rand(9, 9, 3)
56+
image = image_from_array(arr, is_vector=True)
57+
assert np.array_equal(arr, image.data)
58+
assert image.imageType.dimension == 2
59+
assert image.imageType.componentType == FloatTypes.Float64
60+
assert image.imageType.pixelType == PixelTypes.VariableLengthVector
61+
assert image.imageType.components == 3
62+
assert image.bufferedRegion.index[0] == 0
63+
assert image.bufferedRegion.index[1] == 0
64+
assert image.bufferedRegion.size[0] == 9
65+
assert image.bufferedRegion.size[1] == 9

packages/core/python/itkwasm/test/test_polydata.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from dataclasses import asdict
22

33
from itkwasm import PolyData
4+
import itkwasm
45

56

67
def test_polydata():

0 commit comments

Comments
 (0)