ngio 0.5.0b6__py3-none-any.whl → 0.5.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ngio/common/_masking_roi.py +18 -5
- ngio/common/_pyramid.py +129 -30
- ngio/hcs/_plate.py +30 -24
- ngio/images/_abstract_image.py +182 -60
- ngio/images/_create_synt_container.py +5 -1
- ngio/images/_create_utils.py +69 -74
- ngio/images/_image.py +350 -86
- ngio/images/_label.py +39 -31
- ngio/images/_masked_image.py +2 -2
- ngio/images/_ome_zarr_container.py +263 -96
- ngio/io_pipes/_match_shape.py +10 -14
- ngio/io_pipes/_ops_slices.py +6 -4
- ngio/io_pipes/_ops_slices_utils.py +8 -7
- ngio/ome_zarr_meta/_meta_handlers.py +2 -26
- ngio/ome_zarr_meta/ngio_specs/__init__.py +2 -0
- ngio/ome_zarr_meta/ngio_specs/_axes.py +161 -58
- ngio/ome_zarr_meta/ngio_specs/_ngio_hcs.py +78 -32
- ngio/ome_zarr_meta/ngio_specs/_ngio_image.py +36 -0
- ngio/ome_zarr_meta/v04/_v04_spec.py +5 -22
- ngio/ome_zarr_meta/v05/_v05_spec.py +7 -23
- ngio/resources/__init__.py +1 -1
- ngio/resources/resource_model.py +1 -1
- ngio/tables/_tables_container.py +39 -7
- ngio/tables/v1/_roi_table.py +4 -4
- ngio/utils/_zarr_utils.py +8 -15
- {ngio-0.5.0b6.dist-info → ngio-0.5.1.dist-info}/METADATA +3 -2
- {ngio-0.5.0b6.dist-info → ngio-0.5.1.dist-info}/RECORD +29 -29
- {ngio-0.5.0b6.dist-info → ngio-0.5.1.dist-info}/WHEEL +0 -0
- {ngio-0.5.0b6.dist-info → ngio-0.5.1.dist-info}/licenses/LICENSE +0 -0
ngio/images/_label.py
CHANGED
|
@@ -18,12 +18,9 @@ from ngio.ome_zarr_meta import (
|
|
|
18
18
|
update_ngio_labels_group_meta,
|
|
19
19
|
)
|
|
20
20
|
from ngio.ome_zarr_meta.ngio_specs import (
|
|
21
|
-
DefaultSpaceUnit,
|
|
22
|
-
DefaultTimeUnit,
|
|
23
21
|
NgffVersions,
|
|
24
|
-
SpaceUnits,
|
|
25
|
-
TimeUnits,
|
|
26
22
|
)
|
|
23
|
+
from ngio.ome_zarr_meta.ngio_specs._axes import AxesSetup
|
|
27
24
|
from ngio.tables import MaskingRoiTable
|
|
28
25
|
from ngio.utils import (
|
|
29
26
|
NgioValidationError,
|
|
@@ -49,7 +46,7 @@ class Label(AbstractImage):
|
|
|
49
46
|
self,
|
|
50
47
|
group_handler: ZarrGroupHandler,
|
|
51
48
|
path: str,
|
|
52
|
-
meta_handler: LabelMetaHandler
|
|
49
|
+
meta_handler: LabelMetaHandler,
|
|
53
50
|
) -> None:
|
|
54
51
|
"""Initialize the Image at a single level.
|
|
55
52
|
|
|
@@ -59,8 +56,6 @@ class Label(AbstractImage):
|
|
|
59
56
|
meta_handler: The image metadata handler.
|
|
60
57
|
|
|
61
58
|
"""
|
|
62
|
-
if meta_handler is None:
|
|
63
|
-
meta_handler = LabelMetaHandler(group_handler)
|
|
64
59
|
super().__init__(
|
|
65
60
|
group_handler=group_handler, path=path, meta_handler=meta_handler
|
|
66
61
|
)
|
|
@@ -82,21 +77,6 @@ class Label(AbstractImage):
|
|
|
82
77
|
assert isinstance(meta, NgioLabelMeta)
|
|
83
78
|
return meta
|
|
84
79
|
|
|
85
|
-
def set_axes_unit(
|
|
86
|
-
self,
|
|
87
|
-
space_unit: SpaceUnits = DefaultSpaceUnit,
|
|
88
|
-
time_unit: TimeUnits = DefaultTimeUnit,
|
|
89
|
-
) -> None:
|
|
90
|
-
"""Set the axes unit of the image.
|
|
91
|
-
|
|
92
|
-
Args:
|
|
93
|
-
space_unit (SpaceUnits): The space unit of the image.
|
|
94
|
-
time_unit (TimeUnits): The time unit of the image.
|
|
95
|
-
"""
|
|
96
|
-
meta = self.meta
|
|
97
|
-
meta = meta.to_units(space_unit=space_unit, time_unit=time_unit)
|
|
98
|
-
self.meta_handler.update_meta(meta)
|
|
99
|
-
|
|
100
80
|
def build_masking_roi_table(
|
|
101
81
|
self, axes_order: Sequence[str] | None = None
|
|
102
82
|
) -> MaskingRoiTable:
|
|
@@ -120,10 +100,12 @@ class LabelsContainer:
|
|
|
120
100
|
def __init__(
|
|
121
101
|
self,
|
|
122
102
|
group_handler: ZarrGroupHandler,
|
|
103
|
+
axes_setup: AxesSetup | None = None,
|
|
123
104
|
ngff_version: NgffVersions | None = None,
|
|
124
105
|
) -> None:
|
|
125
106
|
"""Initialize the LabelGroupHandler."""
|
|
126
107
|
self._group_handler = group_handler
|
|
108
|
+
self._axes_setup = axes_setup or AxesSetup()
|
|
127
109
|
# If the group is empty, initialize the metadata
|
|
128
110
|
try:
|
|
129
111
|
self._meta_handler = LabelsGroupMetaHandler(group_handler)
|
|
@@ -147,8 +129,13 @@ class LabelsContainer:
|
|
|
147
129
|
meta = self._meta_handler.get_meta()
|
|
148
130
|
return meta
|
|
149
131
|
|
|
132
|
+
@property
|
|
133
|
+
def axes_setup(self) -> AxesSetup:
|
|
134
|
+
"""Return the axes setup."""
|
|
135
|
+
return self._axes_setup
|
|
136
|
+
|
|
150
137
|
def list(self) -> list[str]:
|
|
151
|
-
"""
|
|
138
|
+
"""Return the list of label names in the group."""
|
|
152
139
|
return self.meta.labels
|
|
153
140
|
|
|
154
141
|
def get(
|
|
@@ -176,13 +163,17 @@ class LabelsContainer:
|
|
|
176
163
|
)
|
|
177
164
|
|
|
178
165
|
group_handler = self._group_handler.get_handler(name)
|
|
179
|
-
label_meta_handler = LabelMetaHandler(group_handler)
|
|
166
|
+
label_meta_handler = LabelMetaHandler(group_handler, axes_setup=self.axes_setup)
|
|
180
167
|
path = (
|
|
181
168
|
label_meta_handler.get_meta()
|
|
182
169
|
.get_dataset(path=path, pixel_size=pixel_size, strict=strict)
|
|
183
170
|
.path
|
|
184
171
|
)
|
|
185
|
-
return Label(
|
|
172
|
+
return Label(
|
|
173
|
+
group_handler=group_handler,
|
|
174
|
+
path=path,
|
|
175
|
+
meta_handler=label_meta_handler,
|
|
176
|
+
)
|
|
186
177
|
|
|
187
178
|
def delete(self, name: str, missing_ok: bool = False) -> None:
|
|
188
179
|
"""Delete a label from the group.
|
|
@@ -218,6 +209,7 @@ class LabelsContainer:
|
|
|
218
209
|
pixelsize: float | tuple[float, float] | None = None,
|
|
219
210
|
z_spacing: float | None = None,
|
|
220
211
|
time_spacing: float | None = None,
|
|
212
|
+
translation: Sequence[float] | None = None,
|
|
221
213
|
channels_policy: Literal["same", "squeeze", "singleton"] | int = "squeeze",
|
|
222
214
|
ngff_version: NgffVersions | None = None,
|
|
223
215
|
# Zarr Array parameters
|
|
@@ -244,6 +236,8 @@ class LabelsContainer:
|
|
|
244
236
|
label.
|
|
245
237
|
z_spacing (float | None): The z spacing of the new label.
|
|
246
238
|
time_spacing (float | None): The time spacing of the new label.
|
|
239
|
+
translation (Sequence[float] | None): The translation for each axis
|
|
240
|
+
at the highest resolution level. Defaults to None.
|
|
247
241
|
channels_policy (Literal["squeeze", "same", "singleton"] | int):
|
|
248
242
|
Possible policies:
|
|
249
243
|
- If "squeeze", the channels axis will be removed (no matter its size).
|
|
@@ -279,7 +273,6 @@ class LabelsContainer:
|
|
|
279
273
|
)
|
|
280
274
|
|
|
281
275
|
label_group = self._group_handler.get_group(name, create_mode=True)
|
|
282
|
-
|
|
283
276
|
derive_label(
|
|
284
277
|
ref_image=ref_image,
|
|
285
278
|
store=label_group,
|
|
@@ -288,6 +281,7 @@ class LabelsContainer:
|
|
|
288
281
|
z_spacing=z_spacing,
|
|
289
282
|
time_spacing=time_spacing,
|
|
290
283
|
name=name,
|
|
284
|
+
translation=translation,
|
|
291
285
|
channels_policy=channels_policy,
|
|
292
286
|
ngff_version=ngff_version,
|
|
293
287
|
chunks=chunks,
|
|
@@ -321,6 +315,7 @@ def derive_label(
|
|
|
321
315
|
z_spacing: float | None = None,
|
|
322
316
|
time_spacing: float | None = None,
|
|
323
317
|
name: str | None = None,
|
|
318
|
+
translation: Sequence[float] | None = None,
|
|
324
319
|
channels_policy: Literal["same", "squeeze", "singleton"] | int = "squeeze",
|
|
325
320
|
ngff_version: NgffVersions | None = None,
|
|
326
321
|
# Zarr Array parameters
|
|
@@ -334,7 +329,7 @@ def derive_label(
|
|
|
334
329
|
# Deprecated arguments
|
|
335
330
|
labels: Sequence[str] | None = None,
|
|
336
331
|
pixel_size: PixelSize | None = None,
|
|
337
|
-
) -> ZarrGroupHandler:
|
|
332
|
+
) -> tuple[ZarrGroupHandler, AxesSetup]:
|
|
338
333
|
"""Derive a new OME-Zarr label from an existing image or label.
|
|
339
334
|
|
|
340
335
|
If a kwarg is not provided, the value from the reference image will be used.
|
|
@@ -347,6 +342,8 @@ def derive_label(
|
|
|
347
342
|
z_spacing (float | None): The z spacing of the new label.
|
|
348
343
|
time_spacing (float | None): The time spacing of the new label.
|
|
349
344
|
name (str | None): The name of the new label.
|
|
345
|
+
translation (Sequence[float] | None): The translation for each axis
|
|
346
|
+
at the highest resolution level. Defaults to None.
|
|
350
347
|
channels_policy (Literal["squeeze", "same", "singleton"] | int): Possible
|
|
351
348
|
policies:
|
|
352
349
|
- If "squeeze", the channels axis will be removed (no matter its size).
|
|
@@ -371,12 +368,13 @@ def derive_label(
|
|
|
371
368
|
and time_spacing instead.
|
|
372
369
|
|
|
373
370
|
Returns:
|
|
374
|
-
ZarrGroupHandler: The group handler of the new label
|
|
371
|
+
tuple[ZarrGroupHandler, AxesSetup]: The group handler of the new label
|
|
372
|
+
and the axes setup.
|
|
375
373
|
|
|
376
374
|
"""
|
|
377
375
|
if dtype is None and isinstance(ref_image, Image):
|
|
378
376
|
dtype = "uint32"
|
|
379
|
-
group_handler = abstract_derive(
|
|
377
|
+
group_handler, axes_setup = abstract_derive(
|
|
380
378
|
ref_image=ref_image,
|
|
381
379
|
meta_type=NgioLabelMeta,
|
|
382
380
|
store=store,
|
|
@@ -385,6 +383,7 @@ def derive_label(
|
|
|
385
383
|
z_spacing=z_spacing,
|
|
386
384
|
time_spacing=time_spacing,
|
|
387
385
|
name=name,
|
|
386
|
+
translation=translation,
|
|
388
387
|
channels_meta=None,
|
|
389
388
|
channels_policy=channels_policy,
|
|
390
389
|
ngff_version=ngff_version,
|
|
@@ -398,13 +397,22 @@ def derive_label(
|
|
|
398
397
|
labels=labels,
|
|
399
398
|
pixel_size=pixel_size,
|
|
400
399
|
)
|
|
401
|
-
return group_handler
|
|
400
|
+
return group_handler, axes_setup
|
|
402
401
|
|
|
403
402
|
|
|
404
403
|
def build_masking_roi_table(
|
|
405
404
|
label: Label, axes_order: Sequence[str] | None = None
|
|
406
405
|
) -> MaskingRoiTable:
|
|
407
|
-
"""Compute the masking ROI table for a label.
|
|
406
|
+
"""Compute the masking ROI table for a label.
|
|
407
|
+
|
|
408
|
+
Args:
|
|
409
|
+
label: The label to compute the masking ROI table for.
|
|
410
|
+
axes_order: The order of axes for the computation. If None,
|
|
411
|
+
uses the label's default axes order.
|
|
412
|
+
|
|
413
|
+
Returns:
|
|
414
|
+
A MaskingRoiTable containing ROIs for each label in the segmentation.
|
|
415
|
+
"""
|
|
408
416
|
axes_order = axes_order or label.axes
|
|
409
417
|
array = label.get_as_dask(axes_order=axes_order)
|
|
410
418
|
rois = compute_masking_roi(array, label.pixel_size, axes_order=axes_order)
|
ngio/images/_masked_image.py
CHANGED
|
@@ -34,7 +34,7 @@ class MaskedImage(Image):
|
|
|
34
34
|
self,
|
|
35
35
|
group_handler: ZarrGroupHandler,
|
|
36
36
|
path: str,
|
|
37
|
-
meta_handler: ImageMetaHandler
|
|
37
|
+
meta_handler: ImageMetaHandler,
|
|
38
38
|
label: Label,
|
|
39
39
|
masking_roi_table: MaskingRoiTable,
|
|
40
40
|
) -> None:
|
|
@@ -299,7 +299,7 @@ class MaskedLabel(Label):
|
|
|
299
299
|
self,
|
|
300
300
|
group_handler: ZarrGroupHandler,
|
|
301
301
|
path: str,
|
|
302
|
-
meta_handler: LabelMetaHandler
|
|
302
|
+
meta_handler: LabelMetaHandler,
|
|
303
303
|
label: Label,
|
|
304
304
|
masking_roi_table: MaskingRoiTable,
|
|
305
305
|
) -> None:
|