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/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 | None,
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
- """Create the /labels group if it doesn't exist."""
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(group_handler, path, label_meta_handler)
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)
@@ -34,7 +34,7 @@ class MaskedImage(Image):
34
34
  self,
35
35
  group_handler: ZarrGroupHandler,
36
36
  path: str,
37
- meta_handler: ImageMetaHandler | None,
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 | None,
302
+ meta_handler: LabelMetaHandler,
303
303
  label: Label,
304
304
  masking_roi_table: MaskingRoiTable,
305
305
  ) -> None: